需要记住的事情
关于PHP密码加密已经说了很多,其中大多数都是非常好的建议,但是在开始使用PHP进行密码加密之前,请确保您已经实现了以下内容或准备实现以下内容。
服务器
港口
无论您的加密技术有多好,如果您不能正确地保护运行PHP和DB的服务器,那么您所有的努力都是徒劳的。大多数服务器的功能相对相同,它们都有指定的端口,允许您通过ftp或shell远程访问它们。确保您更改了活动的任何远程连接的默认端口。如果不这样做,实际上就使攻击者在访问您的系统时少做了一步。
用户名
在这个世界上,最好不要使用admin、root或类似的用户名。此外,如果你是在一个基于unix的系统上,不要让根帐户登录可访问,它应该总是只有sudo。
密码
你告诉你的用户要设置好的密码以避免被黑客攻击,你也要这么做。当后门大开着的时候,费劲地锁上前门又有什么意义呢?
数据库
服务器
理想情况下,您希望DB和APPLICATION位于不同的服务器上。由于成本原因,这并不总是可行的,但它确实具有一定的安全性,因为攻击者必须通过两个步骤才能完全访问系统。
USER
始终让您的应用程序拥有自己的帐户来访问DB,并且只给它所需的特权。
然后为您创建一个单独的用户帐户,该帐户不存储在服务器上的任何地方,甚至不存储在应用程序中。
比如总是不要做这个根或类似的东西。
密码
遵循与所有好密码相同的原则。另外,不要在同一系统上的任何SERVER或DB帐户上重复使用相同的密码。
PHP
密码
永远不要在你的数据库中存储密码,而是存储哈希和唯一的盐,我将在后面解释为什么。
哈希
单向哈希!!!!!!!永远不要以一种可以反转的方式哈希密码,哈希值应该是一种方式,这意味着你不反转它们并将它们与密码进行比较,而是以同样的方式哈希输入的密码并比较两个哈希值。这意味着即使攻击者访问了数据库,他也不知道实际的密码是什么,只知道其结果哈希值。这意味着在最糟糕的情况下为用户提供更多的安全性。
有很多不错的散列函数(password_hash, hash等等),但是为了使散列有效,您需要选择一个好的算法。(bcrypt和类似的算法都是不错的算法。)
当哈希速度是关键时,越慢越能抵抗暴力攻击。
哈希中最常见的错误之一是哈希值对用户来说不是唯一的。这主要是因为盐不是唯一产生的。
盐
在散列之前,密码应该始终加盐。Salting在密码中添加一个随机字符串,这样类似的密码在DB中就不会出现相同的密码。然而,如果盐对每个用户都不是唯一的(例如:你使用了硬编码的盐),那么你几乎已经让你的盐变得毫无价值。因为一旦攻击者找到了一个密码盐,他就有了所有密码盐。
当你创建一个salt时,确保它是唯一的密码,然后将完成的散列和salt存储在你的DB中。这将使攻击者在获得访问权限之前必须单独破解每个盐和哈希。这对攻击者来说意味着更多的工作和时间。
用户创建密码
如果用户通过前端创建密码,则意味着必须将密码发送到服务器。这就产生了一个安全问题,因为这意味着未加密的密码将被发送到服务器,如果攻击者能够监听和访问,那么PHP中的所有安全性都是毫无价值的。始终安全地传输数据,这是通过SSL完成的,但即使SSL也不是完美无缺的(OpenSSL的Heartbleed缺陷就是一个例子)。
还要让用户创建一个安全的密码,这很简单,应该一直这样做,用户最终会感激它。
最后,无论你采取什么安全措施,没有什么是100%安全的,保护的技术越先进,攻击就会变得越先进。但是,遵循这些步骤将使您的站点更加安全,并且攻击者更不愿意进行攻击。
下面是一个PHP类,它可以轻松地为密码创建散列和盐
http://git.io/mSJqpw