2

我知道关于这个主题有很多问题,但我真的需要问这个。

今天我一直在研究用 md5 加密密码。

所以我所做的是。

我有 4 种盐。(它们会根据用户值而变化)

  1. 从电子邮件 id 和 substr 然后 md5 他们
  2. from email 和 id substr 其他职位
  3. 一个长字符串,substr 然后 md5 它
  4. 另一个长字符串,substr 然后 md5 它

然后我 md5 salt1 和 3 以及 salt 2 和 salt4 的密码

此后,每当用户更改电子邮件或更改 ID 时,我都必须自动更改密码。

对此你们怎么看?

4

6 回答 6

16

没有。

MD5 坏了。

使用邮件地址作为盐是个好主意。但是使用 md5 不是。请改用 bcrypt、scrypt 或 pbkdf2。

不要发明你自己的加密,除非你真的知道你在做什么,相信我,你不会

于 2013-01-26T14:54:35.617 回答
8

首先,让我们定义几个术语。

  • 加密是指您对消息进行编码以使其无法读取。加密涉及明文密码密钥。这就像将一本书(明文)放在一个上锁的房间(密码)中,只能使用已知工具(钥匙)打开。加密有很多种,但这是一个简单的描述。加密是双向的,这意味着您可以对消息进行编码和解码。

  • 加密哈希是指您获取任何类型的数据并为其生成固定大小的值(通常称为哈希摘要)。加密哈希是单向的,这意味着您无法逆转该过程。

  • 是一个唯一的字符串,或一组位,类似于随机数(一个唯一的数字,只使用一次)。盐仅用于使破解者无法处理哈希列表。它们不应该被用作秘密(即像加密密钥一样)。人们通常在谈到盐时谈论随机性的唯一原因是因为他们想要生成独特的盐(例如,如果随机性不够大,他们可能会得到碰撞盐)。

好的,现在讨论如何散列密码。

一种相对安全的密码散列方法是简单地将唯一的散列附加到密码上,然后将盐与密码一起保存:

$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+) 中,有一个密码散列 API,可以更简单地散列密码。

还有各种散列库。PHPpass是一种流行的方法。

于 2013-01-26T15:45:01.523 回答
3

这很糟糕,因为它使用 MD5。

MD5 是一种非常快速的操作。它可以在显卡硬件上每秒执行数十亿次。将其用于任何与密码相关的事情都被认为是不好的做法。

使用 bcrypt。使用随机盐。使用即将推出的 PHP API 对密码进行散列、验证和重新散列。此包含文件为从 PHP 5.3.7 开始的版本实现它:https ://github.com/ircmaxell/password_compat

于 2013-01-26T14:54:26.483 回答
1

嗯,MD5坏了,坏了”有点夸张。即使它可以用大量 CPU 进行暴力破解,它也没有“损坏”,并且对于很多涉及散列的事情来说仍然是一个非常有用的算法。

所以“ MD5 不应该用于密码加密”对我来说听起来好多了。

使用 PHP 时,一个简单且安全的选择是依赖password_hash()(它本机生成随机盐)和password_verify()函数。

优点是加密算法将随着每个新的 PHP 版本透明地更新(目前PASSWORD_DEFAULT设置为bcrypt,但如果 bcrypt 被“破坏”,它可以设置为更新的算法),这使得使用这些函数的任何代码都非常有弹性.

于 2020-03-12T20:58:56.457 回答
-2

我个人不建议将用户 ID 和他的电子邮件涉及到他的密码散列中。您可以通过以下方式处理密码:

  • 基于用户注册时生成的随机字符串为每个用户动态加盐
  • 在盐的一部分前面加上另一部分在密码周围
  • 双 md5: md5(md5($password))
  • 等等。
于 2013-01-26T14:54:32.613 回答
-2

一种简单的方法是为每个用户生成一个随机盐,然后像这样散列你的密码

public function encodePassword( $raw, $salt ) {
    return hash('sha256', $salt.$raw);
}

对于高安全性哈希,您可以查看此链接,该链接解释了如何实现 PBKDF2:

http://crackstation.net/hashing-security.htm#phpsourcecode

于 2013-01-26T14:59:34.570 回答