AES_DECRYPT如何检查值已在mysql中解密

时间:2016-03-24 16:51:45

标签: mysql sql encryption aes

我想在mysql上使用sql解密数据库中的字段,但在解密之前我需要检查字段是否可以解密。

update customer
set name = aes_decrypt(from_base64(name), 'key')

如果提供的密钥错误或数据无效,则name字段将设置为null;

我尝试添加一个如下所示的where子句,以确保字段名称尚未解密,但这不会一直有效,因为如果密钥不正确或数据无效,aes_decrypt可以返回null或者垃圾。< / p>

update customer
set name = aes_decrypt(from_base64(name), 'key')
where aes_decrypt(from_base64(name), 'key') is not null.

那么如何检查返回的值是null还是“垃圾”?或者还有其他什么方法?

来自mysql doc:“如果输入数据或密钥无效,AES_DECRYPT()可能会返回非NULL值(可能是垃圾)。”

我得到的垃圾示例:w Y 'v Y m _

由于

1 个答案:

答案 0 :(得分:0)

不要存储原始密文,请遵循Defuse Security's PHP encryption library第2版的主角:

  1. Use authenticated encryption
  2. 使用版本标记来说明您使用的库以及需要添加的版本和任何可选配置信息。
  3. 确保计算HMAC(标签|| IV ||密文)而不仅仅是HMAC(密文)。
  4. 将标签,IV / nonce,密文和MAC存储在一起;最好是作为hex或base64编码的字符串。
  5. 然后问题变为&#34;字符串的前N个字节是否计算为我的加密库的已知版本标记&#34;?