我正在尝试对用户密码使用 AES 加密(MySQL 中的 AES_ENCRYPT),但我遇到了很多不同的问题。
这是我用来将新用户存储到数据库中的 SQL 查询:
INSERT INTO user VALUES (
'15',
'John',
'Doe',
'123 Fake St.',
AES_ENCRYPT('mypassword', 'mysalt'),
'mysalt'
)
在实际情况下,salt 是一个随机字符串。
它工作正常。我的意思是,我能够找回原始密码。在此示例中,AES_DECRYPT(user.password, 'mysalt') WHERE user.id = 15
检索 mypassword
。但我可能忽略了一些事情。
将盐和密码一起保存是否安全?除了 security through obscurity thing .
存储散列密码的最佳格式是什么?我正在使用
VARBINARY 但存储的字符串看起来像8�p�����_�Z�\
。最后,密码应该多长,密码应该多长 盐是什么?
谢谢
最佳答案
通常,没有实际需要反向加密密码。拥有这种能力本质上会降低系统的安全性。相反,使用不可逆的哈希函数。我建议生成字符串结果的 SHA-256(或更大):
SHA2 (CONCAT (user.name, user.password, 'some salt', user.id), 256)
散装我也郁闷过rainbow tables通过在密码验证时始终知道的其他数据滚动来避免任何使用。
SHA2
需要 MySQL 5.5 或更高版本。如果您使用的是早期版本,SHA1()
几乎一样好,而且通常比 MD5
、AES
等好得多。
关于mysql - 如何正确使用 AES_ENCRYPT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971532/