如何使用 libsodium php 用盐加密/解密密码
how to encrypt / decrypt password with salt using libsodium php
我想得到的是
- 用 libsodium 加密密码 + salt
- 将其存储到数据库
- 读取并解密(取回普通密码进行身份验证)
我得到了一个盐列表,我想用它来加密/解密我的密码。
当我加密密码时,我得到一个哈希值,这样一个似乎可以工作,但在解密时我总是得到 false 作为 return 值。
我是不是使用了错误的方法来使用 libsodium 进行加密/解密,还是我完全走错了方向?
我的加密/解密来源:
function encrypt_libsodium($to_encrypt, $salt_to_use){
if(!$data || !$salt_to_use){
return null;
}
//get stored salt
$this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);
//some libsodium specific stuff
$out_len = \Sodium\CRYPTO_SIGN_SEEDBYTES;
$ops_limit = \Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE;
$mem_limit =\Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE;
//create hash using libsodium
$hash = \Sodium\crypto_pwhash($out_len, $to_encrypt, $this->key_,$ops_limit, $mem_limit);
return $hash;
}
function decrypt_libsodium($hash, $salt_to_use){
if(!$hash || !$what){
return null;
}
//get stored salt
$this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);
//get verification hash
$decrypted = \Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify($this->key_, $hash);
return $decrypted;
}
感谢任何帮助!
问候Dom
如果你不需要专门使用libsodium,通过这个功能你应该可以将加密的数据存储在数据库中并解密。
define("ENCRYPT_METHOD", "AES-256-CBC");
define("SECRET_KEY","randomtextrandomtextforthesecretkey");
define("SECRET_IV", "randomtextforthesecretiv");
function encriptar($action, $string)
{
$output = false;
$key = hash("sha256", SECRET_KEY);
$iv = substr(hash("sha256", SECRET_IV), 0, 16);
if ($action == "encrypt")
{
$output = openssl_encrypt($string, ENCRYPT_METHOD, $key, 0, $iv);
$output = base64_encode($output);
}
else if($action == "decrypt")
{
$output = base64_decode($string);
$output = openssl_decrypt($output, ENCRYPT_METHOD, $key, 0, $iv);
}
return $output;
}
输出将是您将 store/get 到数据库的数据。
看起来你正在尝试混合许多不相关的东西。 CRYPTO_SIGN_SEEDBYTES
用于签名,与密码散列无关,crypto_pwhash
不使用 scrypt 算法,因此 CRYPTO_PWHASH_SCRYPTSALSA208SHA256_*
常量不适用,我不确定md5()
在这里做什么。而且您可能想要散列密码,而不是加密它。
无论如何,crypto_pwhash_str()
函数可以满足您的所有需求。它创建一个盐,对密码进行哈希处理,并将结果(连同盐、算法及其参数)编码为可以直接存储到数据库中的字符串:
$password = 'correct horse battery staple';
$h = \Sodium\crypto_pwhash_str($password,
\Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
\Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
$h
是您需要存储在数据库中的所有内容。
然后,验证您在数据库中的内容对于给定密码是否有效:
if (\Sodium\crypto_pwhash_str_verify($h, $password) === FALSE) {
// wrong password!
}
我想得到的是
- 用 libsodium 加密密码 + salt
- 将其存储到数据库
- 读取并解密(取回普通密码进行身份验证)
我得到了一个盐列表,我想用它来加密/解密我的密码。 当我加密密码时,我得到一个哈希值,这样一个似乎可以工作,但在解密时我总是得到 false 作为 return 值。
我是不是使用了错误的方法来使用 libsodium 进行加密/解密,还是我完全走错了方向?
我的加密/解密来源:
function encrypt_libsodium($to_encrypt, $salt_to_use){
if(!$data || !$salt_to_use){
return null;
}
//get stored salt
$this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);
//some libsodium specific stuff
$out_len = \Sodium\CRYPTO_SIGN_SEEDBYTES;
$ops_limit = \Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE;
$mem_limit =\Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE;
//create hash using libsodium
$hash = \Sodium\crypto_pwhash($out_len, $to_encrypt, $this->key_,$ops_limit, $mem_limit);
return $hash;
}
function decrypt_libsodium($hash, $salt_to_use){
if(!$hash || !$what){
return null;
}
//get stored salt
$this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);
//get verification hash
$decrypted = \Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify($this->key_, $hash);
return $decrypted;
}
感谢任何帮助!
问候Dom
如果你不需要专门使用libsodium,通过这个功能你应该可以将加密的数据存储在数据库中并解密。
define("ENCRYPT_METHOD", "AES-256-CBC");
define("SECRET_KEY","randomtextrandomtextforthesecretkey");
define("SECRET_IV", "randomtextforthesecretiv");
function encriptar($action, $string)
{
$output = false;
$key = hash("sha256", SECRET_KEY);
$iv = substr(hash("sha256", SECRET_IV), 0, 16);
if ($action == "encrypt")
{
$output = openssl_encrypt($string, ENCRYPT_METHOD, $key, 0, $iv);
$output = base64_encode($output);
}
else if($action == "decrypt")
{
$output = base64_decode($string);
$output = openssl_decrypt($output, ENCRYPT_METHOD, $key, 0, $iv);
}
return $output;
}
输出将是您将 store/get 到数据库的数据。
看起来你正在尝试混合许多不相关的东西。 CRYPTO_SIGN_SEEDBYTES
用于签名,与密码散列无关,crypto_pwhash
不使用 scrypt 算法,因此 CRYPTO_PWHASH_SCRYPTSALSA208SHA256_*
常量不适用,我不确定md5()
在这里做什么。而且您可能想要散列密码,而不是加密它。
无论如何,crypto_pwhash_str()
函数可以满足您的所有需求。它创建一个盐,对密码进行哈希处理,并将结果(连同盐、算法及其参数)编码为可以直接存储到数据库中的字符串:
$password = 'correct horse battery staple';
$h = \Sodium\crypto_pwhash_str($password,
\Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
\Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
$h
是您需要存储在数据库中的所有内容。
然后,验证您在数据库中的内容对于给定密码是否有效:
if (\Sodium\crypto_pwhash_str_verify($h, $password) === FALSE) {
// wrong password!
}