通常对于标准AES,您需要提供随机数(IV),以避免您描述的问题.
一种大幅提高加密数据质量的方法是为每个帐户使用不同的主密码,而不是改变IV.基本上这是一些与密码混合的数据.你可以做很多这样的事情,最简单的就是做一个concat.
例如.
>创建随机序列.
>存储随机数|| HEX(AES_ENCRYPT(password_to_store,master_password || nonce)
>通过提取随机数进行检索,然后使用master_password ||解密数据现时.
这是一个例子,具有唯一的随机数’iej383u8fjeiw'(每次加密时都需要生成一个新的)
SELECT CONCAT('iej383u8fjeiw', ':', HEX(AES_ENCRYPT("password", CONCAT("master_password", "iej383u8fjeiw"))))
-> "iej383u8fjeiw:61224653D4DA33D57A42FE5E5E10DEA9"
SELECT AES_DECRYPT(UNHEX(SUBSTRING_INDEX('iej383u8fjeiw:61224653D4DA33D57A42FE5E5E10DEA9', ':', -1)), CONCAT('master_password', SUBSTRING_INDEX('iej383u8fjeiw:61224653D4DA33D57A42FE5E5E10DEA9', ':', 1)))
-> "password"
或者使用变量:
SELECT CONCAT(nonce, ':', HEX(AES_ENCRYPT(password_to_encrypt, CONCAT(master_password, nonce))))
-> encrypted password
SELECT AES_DECRYPT(UNHEX(SUBSTRING_INDEX(encrypted_password, ':', -1)), CONCAT(master_password, SUBSTRING_INDEX(encrypted_password, ':', 1)))
-> password_to_encrypt
也就是说,虽然比没有nonce的版本安全得多,但还有很多弱点和攻击向量.例如,记录查询或嗅探mysql数据包将显示密码和主密码!