我正在尝试使用AES加密(MySQL中的AES_ENCRYPT)来获取用户密码,但我想出了一些不同的问题。
这是我用来将新用户存储到数据库中的SQL查询:
INSERT INTO user VALUES (
'15',
'John',
'Doe',
'123 Fake St.',
AES_ENCRYPT('mypassword', 'mysalt'),
'mysalt'
)
在实际案例中盐将是随机字符串。
工作正常。我的意思是,我能够检索原始密码。在此示例中,AES_DECRYPT(user.password, 'mysalt') WHERE user.id = 15
检索mypassword
。但我可能会忽略一些事情。
将盐与密码一起保存是否安全?除了security through obscurity thing。
存储哈希密码的最佳格式是什么?我正在使用
VARBINARY但存储的字符串看起来像8�p�����_�Z�\
。
最后,密码需要多长时间,以及密码需要多长时间 盐是吗?
由于
答案 0 :(得分:6)
通常,实际上不需要反向加密密码。具有该能力固有地降低了系统的安全性。相反,使用不可逆的哈希函数。我建议SHA-256(或更大)产生一个字符串结果:
SHA2 (CONCAT (user.name, user.password, 'some salt', user.id), 256)
我还通过滚动密码验证时始终知道的其他数据来阻止批量rainbow tables的使用。
SHA2
需要MySQL 5.5或更高版本。如果您使用的是早期版本,SHA1()
几乎一样好,通常比MD5
,AES
等更好。
答案 1 :(得分:2)
请考虑使用密码哈希而不是加密哈希。目标是不同的。有关详细信息,请参阅https://security.stackexchange.com/a/6415/25424。像https://stackoverflow.com/a/6337021/516813中提到的密码框架可以为您提供很多细节,例如腌制。
答案 2 :(得分:0)
您不应只加密数据库中的密码,而是在数据库中存储密码的表示。
有关详细说明,请参阅this question。