与Mcrypt相比,使用OpenSSL进行加密/解密会导致不同的结果

时间:2019-12-12 17:56:33

标签: php encryption openssl mcrypt

我们用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函数中存在故障。有什么想法吗?

0 个答案:

没有答案