我应该存储密码的哈希值吗?

Str*_*rry 7 php encryption passwords

用户系统和密码:我正在查看MD5的内容,我想知道密码的正常/良好做法是什么.现在,我认为人们会加密密码并存储哈希值.如果是这样,密码检查如何工作?我只是输入密码再次通过加密过程然后用存储的密码检查哈希,对吗?

这个问题可能与上述内容相矛盾,但我的盐是否应该是随机生成的值?如果是的话,何时可能有用?

编辑:除了密码,在用户系统中,还应该加密哪些作为一种好的做法?他们加密用户名或其他任何东西吗?

第二编辑:什么是单向哈希?我的意思是,从技术上讲,我可以不对我的源代码进行反向工程吗?也许这是一个糟糕的问题,因为我对单向哈希知之甚少.

Jos*_*h K 10

首先你创造一个盐.

注意示例是用PHP编写的

// Setup a salt, this isn't "random" but it doesn't really have to be
$salt = sha1(microtime());
Run Code Online (Sandbox Code Playgroud)

然后加密密码

// First we hash the password, then XOR it with the salt hashing the result
$hash = sha1(sha1($password) ^ $salt);
Run Code Online (Sandbox Code Playgroud)

存储$hash$salt数据库.

当用户输入密码时,将其与散列进行比较

if(sha1(sha1($entered_password) ^ $salt) == $hash)
    // Correct password
Run Code Online (Sandbox Code Playgroud)

切勿以可逆格式存储密码.另外我建议不要使用MD5作为哈希.

编辑:除了密码,在用户系统中,还应该加密哪些作为一种好的做法?他们加密用户名或其他任何东西吗?

密码未加密,它们是经过哈希处理的.将哈希(非常简单)描绘成需要数字并将其乘以10的东西.说我想哈希这个数字30.我会说30*10并得到300我的"哈希" 30.需要注意的是,你不能获得30来自300不知道哈希函数是如何工作的.

这是一个非常简单的"哈希",如果你知道它总是乘以十,那么你可以很容易地逆转它.现在来看看SHA1哈希函数.这复杂得多.它不能简单地逆转.

您会发现除密码哈希之外很少有任何东西,并且没有任何内容被加密.加密数据库所需的开销将是巨大的.

你可以在用户名中应用类似的salt/hash模式,但是你有陷阱.如果您想在代码中的某个位置使用该用户名,该怎么办?如果您想检查以确保它是独特的桌子怎么办?

第二编辑:什么是单向哈希?我的意思是,从技术上讲,我可以不对我的源代码进行反向工程吗?也许这是一个糟糕的问题,因为我对单向哈希知之甚少.

见上文(或点击此处).单向哈希就是这样.单向映射.A => B没有别的.B !=> A,A除了以外什么都不能B.

有人提到了一项XOR行动的表现.虽然我觉得性能基本上可以忽略不计,但我还是进行了快速测试.

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
Run Code Online (Sandbox Code Playgroud)

现在跑

$start_time = $this->microtime_float();

for($i = 0; $i < 100000; $i++)
{
 $sha = sha1(sha1(microtime()) . sha1(microtime()));
}

$end_time = $this->microtime_float();

echo "1000 in " . ($end_time-$start_time) . " for CAT\n";


$start_time = $this->microtime_float();

for($i = 0; $i < 100000; $i++)
{
 $sha = sha1(sha1(microtime()) ^ sha1(microtime()));
}

$end_time = $this->microtime_float();

echo "1000 in " . ($end_time-$start_time) . " for XOR\n";
Run Code Online (Sandbox Code Playgroud)

尽可能多地重复.在最初的书面记录使用错误日志,我得到了以下结果:

1000 in 0.468002796173 XOR
1000 in 0.465842008591 XOR
1000 in 0.466115951538 XOR
1000 in 0.498080968857 CAT
1000 in 0.506876945496 CAT
1000 in 0.500174045563 CAT
Run Code Online (Sandbox Code Playgroud)

  • @incrediman:你称之为*体验*,我称之为*安全性*默默无闻*.存储盐是没有问题的,因为它的目的是帮助防止预先计算的哈希攻击.对于破解的数据库(攻击者获取哈希+盐),您依赖于算法的安全性. (9认同)