只是想知道密码加密方法是否有利弊......通常,在将新用户插入数据库之前,我将使用 php 并使用 md5 加密密码。我最近继承了一个项目,他们在 sql 插入查询中使用 PASSWORD() 对其进行加密。所以,现在我想知道使用其中一个是否有优势?
6 回答
请参阅MySQL 文档PASSWORD
:
MySQL Server 中的身份验证系统使用 PASSWORD() 函数;你不应该在你自己的应用程序中使用它。为此,请考虑使用 MD5() 或 SHA2()。另请参阅 RFC 2195,第 2 节(挑战-响应身份验证机制 (CRAM)),了解有关在应用程序中安全处理密码和身份验证的更多信息。
在该注释下方是不依赖该功能的一个很好的理由:
调用 PASSWORD() 的语句可能会记录在服务器日志或历史文件(如 ~/.mysql_history)中,这意味着任何有权读取该信息的人都可以读取明文密码。
密码通常最好使用加盐哈希(SHA 等)存储。这是一个答案,其中列出了一些有关安全密码存储的有用链接。
如果有人正在嗅探数据包并且您使用密码,他们将能够看到“插入用户值('用户名',密码('秘密'))”。我认为 MySQL 也有 MD5 函数,但出于同样的原因不应该使用它。
SHA-1 和 MD5 已被破坏,建议您使用带盐值的 SHA-256(可能基于用户名)。盐基本上是附加在密码上的字符串,以帮助防止使用彩虹表来计算密码。
SHAx 和 MD5 都不是加密,而是散列。
查看 mcrypt 库以进行实际加密。
http://php.net/manual/en/book.mcrypt.php
编辑:正如 ircmaxell 所指出的,不应加密密码(除非您正在构建密码管理器),而应使用随机盐值进行单向哈希。(例如:SHA1)
如果您使用 PHP 而不是 MySQL,PHP 建议不要使用 MD5 来保护密码:
http://php.net/manual/en/function.md5.php
相反,请使用以下crypt
功能:
如果您知道明文密码的哈希值(PASSWORD() 将为密码返回的值),为避免指定明文密码,请指定以关键字 PASSWORD 开头的哈希值:
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';
根据维基:
1996年,发现MD5的设计存在缺陷。