当我第一次开始编码以散列用户密码时,我最初使用的是MD5。
$password1 = md5($password);
在阅读了不同意见的页面后,我将使用什么? crypt
,SHA1
,SHA256
...这是我如何使用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)
{
如何改进/更改此代码并使其更安全? ..我可以有一个例子..我应该做动态盐析并为数据库中的每个用户添加一个独特的盐吗?
答案 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
答案 3 :(得分:0)
我会查看一个库来处理密码哈希/腌制/检查等。一个简单易用的实现是Portable PHP password hashing framework。这是wordpress和许多其他php应用程序使用的相同库。它会自动检查最安全的php哈希算法。由于php发行版支持不同的算法。这样,您可以在不牺牲可移植性的情况下获得最大可能的安全性。
我非常喜欢它,因为它给我带来了很多麻烦。对于安全加密的人来说,我宁愿依赖那些比我聪明的人。