不能 AES_DECRYPT (MySQL) 使用 openssl_encrypt (PHP) 加密的字符串

Posted

技术标签:

【中文标题】不能 AES_DECRYPT (MySQL) 使用 openssl_encrypt (PHP) 加密的字符串【英文标题】:Can't AES_DECRYPT (MySQL) a string encrypted with openssl_encrypt (PHP) 【发布时间】:2021-11-05 01:06:38 【问题描述】:

我正在使用 php 脚本使用“aes-256-cbc”密码加密字符串。这些字符串存储在 mysql 数据库中,我希望 MySQL 对其进行解密。

这是我的 PHP 加密函数:

function encrypt($token) 
    if($token !== "" && $token !== null && $token !== false) 
      $cipher_method = 'aes-256-cbc';
      $iv = "98awg9X7SiI3jxp3";
      $enc_key = hash("sha256", "Pn6nK7Gs9r");
      $crypted_token = openssl_encrypt($token, $cipher_method, $enc_key, 0, $iv);
      return $crypted_token;
     
    return $token;


echo hash("sha256", "Pn6nK7Gs9r"); // output 67fa26a5570901994ef1eae105b9286fca44b6f79e200a9fbbd5cff897c3a7ce
echo encrypt("test"); // output Xq1CcrpteSqcybePun+6pQ==

这是我的 MySQL 脚本:

SET block_encryption_mode = 'aes-256-cbc';
SET @key_str = SHA2('Pn6nK7Gs9r',256);
SET @init_vector = "98awg9X7SiI3jxp3";
SET @encrypted = "Xq1CcrpteSqcybePun+6pQ==";

SELECT @key_str; # output 67fa26a5570901994ef1eae105b9286fca44b6f79e200a9fbbd5cff897c3a7ce
SELECT AES_DECRYPT(@encrypted,@key_str,@init_vector); # output NULL
SELECT cast(AES_DECRYPT(@encrypted,@key_str,@init_vector) as char(100)); # output NULL
SELECT AES_DECRYPT(cast(@encrypted as BINARY),@key_str,@init_vector); # output NULL
SELECT cast(AES_DECRYPT(cast(@encrypted as BINARY),@key_str,@init_vector) as char(100)); # output NULL

如您所见,它总是给出 NULL。 (预期结果:测试)。 我尝试了其他的东西:

SET block_encryption_mode = 'aes-256-cbc';
SET @key_str = SHA2('Pn6nK7Gs9r',256);
SET @init_vector = "98awg9X7SiI3jxp3";
SET @string = "test";

SELECT AES_ENCRYPT(@string,@key_str,@init_vector); # output [BLOB - 16 B]
SELECT cast(AES_ENCRYPT(@string,@key_str,@init_vector) as char(100)); # output empty value

我本来希望 AES_ENCRYPT 返回一个加密字符串 (Xq1CcrpteSqcybePun+6pQ==)。我做错了什么?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

首先,当您计算散列时,您应该检索二进制值以获得准确的 256 位。 要在 PHP 中执行此操作,请将 true 传递给 hash()

<?php
function encrypt($token) 
    $cipher_method = 'aes-256-cbc';
    $iv = '98awg9X7SiI3jxp3';
    $key = hash('sha256', 'Pn6nK7Gs9r', true);
    $crypted_token = openssl_encrypt($token, $cipher_method, $key, 0, $iv);
    return $crypted_token;


echo encrypt('test');
?>

输出:

5EMRiQCvOjQjNSlwpYKyfQ==

注意结果是以 Base64 编码的。

在 MySQL 中,要获取哈希的二进制值,请使用 UNHEX()。 要解码 Base64 字符串,请使用 FROM_BASE64()

SET block_encryption_mode = 'aes-256-cbc';
SET @key = UNHEX(SHA2('Pn6nK7Gs9r',256));
SET @iv = '98awg9X7SiI3jxp3';
SET @ciphertext = FROM_BASE64('5EMRiQCvOjQjNSlwpYKyfQ==');

SELECT AES_DECRYPT(@ciphertext, @key, @iv);

输出:

test

【讨论】:

感谢您的帮助,奥利维尔 :)【参考方案2】:

CAST(AES_ENCRYPT(....) AS CHAR) 是问题所在。 AES_ENCRYPT 返回“二进制”数据,而不是“字符”日期。

Xq1CcrpteSqcybePun+6pQ== 看起来像是从TO_BASE64(...) 输出的输出。

【讨论】:

感谢您的帮助瑞克 :) !

以上是关于不能 AES_DECRYPT (MySQL) 使用 openssl_encrypt (PHP) 加密的字符串的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中 AES_DECRYPT 加密,如何在瀚高数据库中使用

MySql AES_DECRYPT & AES_ENCRYPT 密钥在 PHP 中不起作用

AES_DECRYPT() 返回空字段

休眠 Java:未找到函数“AES_DECRYPT”; SQL 语句:

MySQL加密

mysql加密算法