mysql - 如何正确使用 AES_ENCRYPT?

标签 mysql security aes collation

我正在尝试对用户密码使用 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() 几乎一样好,而且通常比 MD5AES 等好得多。

关于mysql - 如何正确使用 AES_ENCRYPT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971532/

相关文章:

python - 使用 AES+CTR 的 PyCrypto 问题

mysql - 在 solrconfig.xml 中设置 <autocommit> 需要什么

mysql - 我将如何在 MySQL 中执行此操作?

mysql查询从一个表中选择,使其列的值不存在于另一表中同一列的值中

mysql - INET_ATON 的 SQL Server 等价物是什么

security - Laravel5 - 如何在 Blade 中仅渲染 html 标签而不渲染 javascript?

java - 解决 JBoss 中的 session 固定问题

java - AES 算法在我的数据字符串中间返回垃圾字符

ios - Obj-C 和 VB.Net 之间的加密兼容性

security - 盐的目的是什么?