我知道有很多关于这个问题的问题,但我真的需要问这个。
今天我一直在用md5加密密码。
所以我所做的就是。
我得到了4种盐。 (它们会根据用户值而变化)然后我md5 salt1和3以及盐2和盐4的密码
在此之后,每当用户更改其电子邮件或更改其ID时,我都必须自动更改密码。
你们对此有何看法?
答案 0 :(得分:14)
没有
MD5坏了。
使用mailaddress作为盐是个好主意。但是使用md5不是。请改用bcrypt,scrypt或pbkdf2。
除非你真的知道自己在做什么,否则不要发明自己的意识,相信我,你不会
答案 1 :(得分:5)
首先,让我们定义一些术语。
加密是对邮件进行编码以便无法读取的信息。加密涉及plaintext,cipher和key。这就像把一本书(明文)放在一个锁定的房间(密码)中,只能用一个已知的工具(一把钥匙)打开。加密有很多种,但这是一个简单的描述。加密是双向的,这意味着您可以对消息进行编码和解码。
加密 哈希是指您获取任何类型的数据并为其生成固定大小的值(通常称为< em> hash 或摘要)。加密哈希是单向的,这意味着你无法逆转这个过程。
salt 是唯一的字符串或位集合,类似于nonce(仅使用一次的唯一数字)。盐只用于使其不可行,以便饼干处理哈希列表。它们不应被用作秘密(即加密密钥)。当谈到盐时,人们通常谈论随机性的唯一原因是因为他们想要产生一种独特的盐(例如,如果随机性不够大,他们可能会遇到碰撞的盐)。
好的,现在你应该如何散列密码。
一种相对安全的哈希密码方法是简单地在密码上添加一个唯一的哈希值,然后用密码保存盐:
$pass = 'this is my password';
$salt = uniqid('', true);
$hash = sha1($pass . $salt);
// INSERT INTO users ('hash', 'salt') VALUES ('$hash', '$salt') WHERE ...
如果您的网站没有从其用户那里检索任何敏感数据,这是一种可行的方法。
如果您处理敏感数据,或者您只是想确保您正在尽一切可能保证安全,那么有一个PHP函数可以为您进行散列处理。它被称为crypt()
(阅读文档以了解它是如何工作的)。以下是使用函数散列密码的示例:
$pass = 'this is my password';
$salt = 'unique string';
$hash = crypt($password, '$2y$07$'.$salt.'$');
echo $hash;
这将安全地散列密码。
要意识到的是crypt()
功能比你想出的任何东西都安全得多(除非你是该领域的专家)。
在较新版本的PHP(5.5.0+)中,有password hashing API可以更简单地散列密码。
还有各种哈希库。 PHPass是一个受欢迎的。
答案 2 :(得分:3)
这很糟糕,因为它使用的是MD5。
MD5是一种非常快速的操作。它可以在图形卡硬件上每秒执行数十亿次。将它用于任何与密码相关的事情被认为是不好的做法。
使用bcrypt。使用随机盐。使用即将推出的PHP API进行散列,验证和重新密码。这个包含文件为从PHP 5.3.7开始的版本实现它:https://github.com/ircmaxell/password_compat
答案 3 :(得分:1)
好吧,“ MD5坏了并且坏了” 。即使它可以用很多CPU暴力破解,它也不会被“破坏”,对于许多涉及哈希的事情来说仍然是非常有用的算法。
所以“ 不应将MD5用于密码加密”对我来说要好得多。
使用PHP时,一种简单而安全的选择是依靠password_hash()
(本机生成随机盐)和password_verify()
函数。
优点是,加密算法将随每个新的PHP版本透明地更新(目前PASSWORD_DEFAULT
设置为bcrypt
,但是如果bcrypt被“破坏”,则可以将其设置为更新的算法),这使得使用这些功能的任何代码都具有相当的弹性。
答案 4 :(得分:-2)
我个人不建议将用户ID和他的电子邮件包含在他的密码哈希中。 您可以通过以下方式处理密码:
答案 5 :(得分:-2)
一种简单的方法是为每个用户生成一个随机盐并像这样哈希密码
public function encodePassword( $raw, $salt ) {
return hash('sha256', $salt.$raw);
}
对于高安全性哈希,您可以查看此链接,该链接说明如何实施PBKDF2: