mysql盐_阻止密码,盐,AES,MySQL和凭证存储的最佳实践

我有一种情况,我必须存储密码,因为我正在构建一个系统来连接到另一个系统.此其他系统仅允许单个用户帐户,并且连接到它的唯一方法是通过密码.哈希在这里不合适.我必须以可以检索密码的方式存储密码.

现在,知道这不是一个完美的系统,我试图限制损害,如果有人以某种方式访问​​数据库.由于这个数据库需要被不同的平台使用,我决定使用MySQL自己的内置加密功能.这样,我不必担心为各种语言和系统找到兼容的加密/解密算法实现.我可以在查询中使用MySQL的函数.

存储密码时,我将使用AES_ENCRYPT(“密码”,“加密密钥”).然后我意识到我应该使用一些盐,这样如果他们能够获得一个密码,那么获取其他密码会更难.可是等等!有什么意义?如果他们能够获得一个密码,他们必须有加密密钥,是吗?

此外,这是一个分组密码.在某些情况下,盐可能几乎无用.

/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362FBB5D173CBAFA44DC406B69D05A2072C */

SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassword", "encryption key"));

/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362C49AF8D5B194770E64FEF88767206391 */

SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassworda", "encryption key"));

我的问题

>我认为在我这样的情况下使用对称加密时没有理由没有盐吗?

>鉴于我必须以允许我检索原始值的方式存储密码,我还应该考虑其他任何方法吗? (我知道我需要注意加密密钥的存储位置和方式,并且我需要保护我的MySQL日志.)

解决方法:

通常对于标准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数据包将显示密码和主密码!

标签:block-cipher,mysql,aes

来源: https://codeday.me/bug/20190901/1780474.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值