如何正确使用AES_ENCRYPT?

时间:2012-04-02 06:00:27

标签: mysql security aes collation

我正在尝试使用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�\

  • 最后,密码需要多长时间,以及密码需要多长时间 盐是吗?

由于

3 个答案:

答案 0 :(得分:6)

通常,实际上不需要反向加密密码。具有该能力固有地降低了系统的安全性。相反,使用不可逆的哈希函数。我建议SHA-256(或更大)产生一个字符串结果:

 SHA2 (CONCAT (user.name, user.password, 'some salt', user.id), 256)

我还通过滚动密码验证时始终知道的其他数据来阻止批量rainbow tables的使用。

SHA2需要MySQL 5.5或更高版本。如果您使用的是早期版本,SHA1()几乎一样好,通常比MD5AES等更好。

答案 1 :(得分:2)

请考虑使用密码哈希而不是加密哈希。目标是不同的。有关详细信息,请参阅https://security.stackexchange.com/a/6415/25424。像https://stackoverflow.com/a/6337021/516813中提到的密码框架可以为您提供很多细节,例如腌制。

答案 2 :(得分:0)

您不应只加密数据库中的密码,而是在数据库中存储密码的表示

有关详细说明,请参阅this question