Md5 salt password php


Md5 salt password php

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

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

所以我所做的是。

我得到了4个盐。(它们根据用户值而变化)

  1. 从电子邮件 ID 和 substr 然后 md5 它们
  2. 从电子邮件和 ID 替换其他位置
  3. 一个长字符串,将其减去,然后 md5 它
  4. 另一个长字符串,替换它,然后 md5 它

然后我 md5 盐 1 和 3 以及带有盐 2 和盐 4 的密码

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

你们对此怎么看?

什么都没有。

MD5坏了,坏了。

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

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

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

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

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

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

好的,现在谈谈您应该如何散列密码。

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

$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,可以更轻松地对密码进行哈希处理。

那里还有各种哈希库。PHPass是一个流行的。

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

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

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

好吧,"MD5 坏了而且坏了"有点夸张。即使它可以用大量的CPU暴力破解,它也不会"损坏",对于很多涉及散列的事情来说仍然是一种非常有用的算法。

所以"MD5不应该用于密码加密"对我来说听起来要好得多。

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

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

我个人不建议将用户ID和他的电子邮件纳入其密码的哈希处理中。您可以通过以下方式处理密码:

  • 基于用户注册时生成的随机字符串的每个用户的动态盐
  • 在盐的前置一部分,并在密码周围附加另一部分
  • 双md5: md5(md5($password))
  • 等。

一个简单的方法是为每个用户生成一个随机盐,并像这样对密码进行哈希处理

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

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

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