更新后的 PHP 现代 PHP 中的密码安全性(1)
- UID
- 1066743
|
更新后的 PHP 现代 PHP 中的密码安全性(1)
从一开始,PHP 就是一种为构建网站而生的编程语言。这一理念植根于 PHP 核心的深度比任何其他编程语言都要深,这或许就是 PHP 在 Web 应用程序构建领域变得且保持如此流行的一个原因。但是,当 PHP 于上世纪 90 年代中期首次设计出来时,术语 Web 应用程序 甚至还不存在。因此,密码保护不是 PHP 创建者投入资源设计的功能之一。毕竟,在只是使用 PHP 在网页上植入站点访问计数器或一个修改日期戳时,您不必再担心密码问题。
但 20 年过去了,现在,人们几乎无法想象创建一个不涉及受密码保护的用户帐户的 Web 应用程序。PHP 程序员最重要的工作就是使用最新、最安全的方法来保护帐户密码。为此,PHP 5.5 添加了一个由 Anthony Ferrara ( ) 创建的新的密码哈希库。该库提供了一些函数,您可使用它们通过目前的最佳实践方法来处理单向密码加密。其他功能旨在满足未来的安全需求,以便随着计算机和攻击者水平更加进步,您始终可抢先坏人一步。本文将深入介绍该库的函数,以及如何最有效地使用它们。
关于本系列PHP 作为一个活跃的开源项目在不断的改进,目前为许多 Web 网站提供支持。PHP 早期是一种模板语言,从那时到现在,PHP 已经历了显著的变化。如果您多年没有使用过或评估过 PHP 技术,那么您很可能几乎认不出当前的一些 PHP 项目。本系列文章将向您展示最新的 PHP 功能,以及如何使用当今的 PHP 来构建现代化的、安全的网站。
安全哈希的重要性“像对待牙刷一样对待您的密码。不要让其他任何人使用它,并且每隔 6 个月换一个新密码。”
Clifford Stoll
以下建议或许不言自明(至少我希望是这样):绝不将用户的密码存储为明文。始终使用 等单向加密算法存储密码的加密版本,以使任何能够访问您的帐户数据库的人都无法发现您用户的密码。此警告不仅适用于保护用户远离通过获取数据库访问权来损害您的网站的人。您还需要防御您组织内拥有恶意企图的人。
什么是哈希?哈希算法 获取一个任何长度的字符串并采用一致的方式创建一个哈希值:一种固定长度的字符串表示。每次传入同一个原始字符串,您都会收到相同的哈希值。这是一个单向过程,您无法从中获得原始字符串。
此需求变得越来越紧迫,因为不幸的是,许多用户对多个网站使用相同的密码。如果有人能够访问您的某个用户的电子邮件地址和原始密码,他很可能能够访问该用户在其他网站上的帐户。
破解速度 所有哈希值不是以同一种方式创建。那么您就可以使用各种算法来创建哈希值。过去常用的两个算法是 和 。如今强大的计算机很容易破解这两种算法。举例而言,已有 能够在单个 GPU 上以每秒 36.5 亿次计算的速率破解 MD5 的哈希值,以每秒 13.6 亿次计算的速度破解 SHA-1 的哈希值。依据这样的速率,根据密码的复杂性和长度,可以在不到半小时内破解一个哈希值。
所以,使用在计算上更复杂的哈希算法很重要。您不仅想要更长的哈希值(这会减少哈希碰撞的机会,也就是说,减少两个短语生成相同的哈希值的机会),您还希望生成哈希值所花的时间尽可能长。为什么?对于您自己的 Web 应用程序,用户每次登录时仅需等待生成一个密码哈希值一次。如果等待时间持续 1 秒(或者甚至两秒),用户不会关心,甚至不会注意到。但通过将破解尝试从每秒 36 亿此计算的减慢到每秒 1 次,任何尝试的难度都会呈指数级增长。
彩虹表 您还需要防御彩虹表。彩虹表(比如您可以在 上访问的 MD5)是哈希值的逆向查找表。该表的创建者预先计算所有常见单词、短语、修改的单词,甚至随机字符串的 MD5 哈希值。能够访问某个哈希值的人可在查找表中输入它,发现用于生成它的密码,从而有效地反转这个单向过程。破解 MD5 哈希值的相对较低的处理成本使得创建彩虹表成为了可能。
为一个计算上复杂的算法生成彩虹表需要花长得多的时间。但仍然可能做到,而且创建者只需付出一次性的努力。合适的应对措施是向您的哈希值添加 SALT。在此上下文中, SALT 指的是任何在创建哈希值之前首先添加到您的密码中的短语。通过使用 SALT,您最终会(在实际中)战胜彩虹表。其他人需要生成一个特定于您的应用程序的彩虹表,然后破解多个密码,才会找到 SALT是什么 — 这是一种复杂的、代价高昂的场景。 |
|
|
|
|
|