Encrypt password before storing in database?
我有一个密码通过php脚本user.php从我的iPhone应用程序传递到数据库。
变量$pass由以下内容填充:
1 |
如何在它插入到数据库之前对其进行加密?我读过一些关于不同技术的文章,但是我在寻找最好的方法来管理它。
谢谢大家。
虽然下面的答案在技术上仍然是正确的,但是对于要使用的散列算法,PHP有新的建议。从php>=5.5.0开始,他们的建议是使用
如果您不关心检索实际密码的值(从数据库加密的值),可以对其运行单向哈希算法(如sha1)。此函数将返回一个特定长度的字符串(哈希),该字符串不能用于查找原始字符串(理论上)。两个不同的字符串可能会创建相同的哈希(称为冲突),但这不应该是密码的问题。例子:
$pass = sha1($_REQUEST['pass']);
有一件事,要使它更安全一点,就是在散列中添加一个salt,然后再次运行散列函数。这使得恶意生成密码散列更加困难,因为salt值只在服务器端处理。例子:
$pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@$#(%"));
使用PHP的密码库。MD5不是加密,它是散列。
另外,在密码上撒盐。为什么?
- 这个答案
- 另一个好答案
首先,您应该创建一个随机的用户salt。然后您应该将它和密码散列存储在数据库中。
在数据库中保存$salt和$pass。然后,当他们登录时,您查找他们的行并检查哈希:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
为每个帐户创建一个用户salt可以确保彩虹表是无用的,任何闯入您的服务器的人都必须对每个密码进行暴力破解。
在地窖里加点盐。如
1 2 3 4 | $user = strip_tags(substr($_REQUEST['user'],0,32)); $plain_pw = strip_tags(substr($_REQUEST['pass'],0,32)); $password = crypt(md5($plain_pw),md5($user)); |
如http://www.ibm.com/developerworks/opensource/library/os-php-encrypt所示/
最基本的:用md5或sha1散列它
1 |
或
1 |
最近我也开始存储用户名哈希,所以登录尝试是安全的,只使用哈希数据进行比较。
你可以用额外的数据"盐"散列,所以如果它们被破坏了,就找不到它的值(尝试搜索一些简单的散列词)。也就是说,使用一个站点范围的字符串来更改标准散列,如
为了找出MD5,Sha1和他们的快速朋友可能不是一个好主意,你应该阅读彩虹表足够多的帖子:你需要知道的关于安全密码方案的托马斯普塔切克。要点:
Finally, we learned that if we want to
store passwords securely we have three
reasonable options: PHK’s MD5 scheme,
Provos-Maziere’s Bcrypt scheme, and
SRP. We learned that the correct
choice is Bcrypt.
注意:是phk,不是php。
您应该使用sha1来散列密码以便存储在数据库中。这是存储密码最简单但最有效的方法:
1 |
它也非常安全。虽然它的完整性开始蔓延,但将该功能升级到sha-256(这是非常安全的)相当容易。