hash — как зашифровать / расшифровать пароль с помощью соли с помощью libsodium Stack Overflow

То, что я пытаюсь получить, это

  • зашифровать пароль + соль с помощью libsodium
  • сохранить его в базе данных
  • прочитайте и расшифруйте (верните простой пароль для аутентификации)

У меня есть список солей, которые я хочу использовать для шифрования / дешифрования моего пароля.
Когда я зашифровываю пароль, я возвращаю хэш, так что кажется, что он работает, но при расшифровке я всегда получаю false в качестве возвращаемого значения.

Использую ли я неправильные методы для шифрования / дешифрования с помощью 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;
}

Я ценю любую помощь!

С уважением Дом

0

Решение

Если вам не нужно специально использовать 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;
}

Выходными данными будут данные, которые вы будете хранить / получать в базу данных.

1

Другие решения

Похоже, вы пытаетесь смешать много разных вещей. 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!
}
3

По вопросам рекламы [email protected]