【发布时间】:2021-11-28 15:58:01
【问题描述】:
我正在尝试将加密文本存储在我的数据库中,但我不知道如何将其解密回来。我试过了
$salt = 'c0d4#';
$pepper ='nsa-cia-fbi'; // secret text
$pwd_peppered = hash_hmac("sha256", $salt, $pepper);
$pwd_hashed = password_hash($pwd_peppered, PASSWORD_ARGON2ID);
echo($pwd_hashed);
// right password hash
$pwd_hashed = '$argon2id$v=19$m=65536,t=4,p=1$QnVpT1Rqay5WSmIvRW1HZg$rgx+DWPl5bvjwlr7plnOjnE1Sf8lim01pwb6lHGzEaU';
//wrong password hash : for testing purposes
$pwd_hashed_wrong = '$argon2id$v=19$m=65536,t=4,p=1$QnVpT1Rqay5WSmIvRW1HZg$rgx+DWPl5bvjwlr7plnOjnE1Sf8lim01pwb6lHGzEaU-wrong-!!';
if (password_verify($pwd_peppered, $pwd_hashed)) {
echo "Password matches.";
// I am inside this block of codes, but ...
// no idea how to decrypt and get my text back ... ????
}
else {
echo "Password incorrect.";
}
【问题讨论】:
-
加密与散列不同。您可以将加密令牌存储在数据库中,并在从数据库中检索时对其进行解密,但如果您散列某些内容,则无法取消散列。
-
为什么要重新发明轮子?使用JWT,它们使用密钥签名,因此您可以确保数据的完整性。
-
@TimLewis 感谢您的解释。您推荐的最佳加密是什么?
-
laravel.com/docs/8.x/encryption。 Laravel 内置了这个功能。当你想存储一个加密的令牌时,你可以将其设置为
Crypt::encryptString($plainTextToken),检索后,你将通过Crypt::decryptString($encryptedToken);解密。旁注,如果您在password上使用它,您将面临严重的安全漏洞。 -
停止尝试将盐附加到您的明文中,这是一个散列的事情。 [IMO 辣椒普遍无用,但这是另一个论点] 一个像样的密码将使用初始化向量 [IV],一个像样的加密库 [例如:laravel 的,希望] 将对您透明地处理。
标签: php laravel laravel-5 encryption cryptography