首先,让我们定义几个术语。
加密是指您对消息进行编码以使其无法读取。加密涉及明文、密码和密钥。这就像将一本书(明文)放在一个上锁的房间(密码)中,只能使用已知工具(钥匙)打开。加密有很多种,但这是一个简单的描述。加密是双向的,这意味着您可以对消息进行编码和解码。
加密哈希是指您获取任何类型的数据并为其生成固定大小的值(通常称为哈希或摘要)。加密哈希是单向的,这意味着您无法逆转该过程。
盐是一个唯一的字符串,或一组位,类似于随机数(一个唯一的数字,只使用一次)。盐仅用于使破解者无法处理哈希列表。它们不应该被用作秘密(即像加密密钥一样)。人们通常在谈到盐时谈论随机性的唯一原因是因为他们想要生成独特的盐(例如,如果随机性不够大,他们可能会得到碰撞盐)。
好的,现在讨论如何散列密码。
一种相对安全的密码散列方法是简单地将唯一的散列附加到密码上,然后将盐与密码一起保存:
$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是一种流行的方法。