我们用OpenSSL替换了Mcrypt,以加密和解密存储在数据库中的密码。这些是我们正在使用的新功能:
function encrypt_openssl_password($key, $pwd)
{
$cipher="AES-256-CBC";
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes( $ivlen );
$encrypted = base64_encode(
$iv .
openssl_encrypt(
$pwd,
$cipher,
hash('sha256', $key, true),
OPENSSL_RAW_DATA,
$iv
)
);
return $encrypted;
}
function decrypt_openssl_password($key, $str)
{
$data = base64_decode($str);
$cipher="AES-256-CBC";
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($data, 0, $ivlen);
$decrypted = rtrim(
openssl_decrypt(
base64_encode(substr($data, $ivlen)),
$cipher,
hash('sha256', $key, true),
OPENSSL_ZERO_PADDING,
$iv),
"\0"
);
return $decrypted;
}
问题:
当我们解密旧密码(使用Mcrypt加密)时,将使用新的OpenSSL函数返回正确的值string(12) "password2019"
。
当我们现在使用新的OpenSSL函数存储完全相同的密码时,我们将收到错误的值string(16) "password2019"
由于解密旧密码有效,因此我们假设encrypt_openssl_password
函数中存在故障。有什么想法吗?