加密用户密码的理想方式

时间:2012-06-30 04:09:20

标签: php

当我第一次开始编码以散列用户密码时,我最初使用的是MD5。

 $password1 = md5($password);

在阅读了不同意见的页面后,我将使用什么? cryptSHA1SHA256 ...这是我如何使用SHA1和静态salting修改代码的示例。

$salt = '324912343223942833294328432392';
$passwordarray = str_split($password,2);
$password1 = sha1($passwordarray[0].$salt.$passwordarray[1]);
//insert $password1 into database
登录并检查密码时

..

$salt = '324912343223942833294328432392';

    $passwordarray = str_split($password,2);
    $dbpasswordarray = str_split($dbpasswordarray,2);

    $password = sha1($passwordarray[0].$salt.$passwordarray[1]);
    $dbpassword = sha1($dbpasswordarray[0].$salt.$dbpasswordarray[1]);

               if ($username==$dbusername&&md5($password3)==$dbpassword)
               {    

如何改进/更改此代码并使其更安全? ..我可以有一个例子..我应该做动态盐析并为数据库中的每个用户添加一个独特的盐吗?

4 个答案:

答案 0 :(得分:3)

你应该use bcrypt

MD5,SHA-1等的问题在于它们被设计为快速计算。这使得暴力破解和字典攻击变得容易,因为您可以每秒测试数百万个密码。

Bcrypt故意缓慢解决这个问题。它有一个可以调整的工作因子,以便随着硬件的改进,你可以使计算更加困难。

相关

答案 1 :(得分:0)

部分原因在于您希望在保护登录时花费多少精力。在过去的几年里,我一直在寻求动态盐腌/每个用户都有自己的盐价值。这可以防止黑客使用彩虹表,如果他们得到你的数据库。我也使用sha256哈希。

答案 2 :(得分:0)

也许你可以效仿现有的库或框架。

例如,Django框架解释说:

  

Django如何存储密码

     

User对象的password属性是这种格式的字符串:

     

algorithm $ hash

     

这是一个存储算法,并且由哈希分隔   美元符号字符。该算法是多种方式之一   Django可以使用的散列或密码存储算法;见下文。该   hash是单向函数的结果。

     

默认情况下,Django使用带有SHA256哈希值的PBKDF2算法   NIST推荐的密码拉伸机制。这应该是   对大多数用户来说足够了:它非常安全,需要大量用户   计算时间的大小。

在存储密码时,它们还提供了有关推荐做法的有用链接:http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf

来源https://docs.djangoproject.com/en/dev/topics/auth/

答案 3 :(得分:0)

我会查看一个库来处理密码哈希/腌制/检查等。一个简单易用的实现是Portable PHP password hashing framework。这是wordpress和许多其他php应用程序使用的相同库。它会自动检查最安全的php哈希算法。由于php发行版支持不同的算法。这样,您可以在不牺牲可移植性的情况下获得最大可能的安全性。

我非常喜欢它,因为它给我带来了很多麻烦。对于安全加密的人来说,我宁愿依赖那些比我聪明的人。