随机字符串与散列和加盐字符串

问题描述 投票:0回答:3

假设我想创建一个纯粹随机的密码,将其命名为

randPass
,大小为 32 个字符。

与散列和加盐相比,直接使用它作为密码在安全性方面是否有任何优势(如

md5(randPass + salt)

我的意思是,最终,它们都将是 32 个字符长的随机字符。

这是一个虚拟示例:

salt = SFZYCr4Ul1zz1rhurksC67AugGIYOKs5;
randPass = VgQK1AOlXYiNwfe74RlU8e8E4szC4UXK;

然后

md5(randPass + salt) = md5(VgQK1AOlXYiNwfe74RlU8e8E4szC4UXKSFZYCr4Ul1zz1rhurksC67AugGIYOKs5)
变成

hash = dddbc2cbda808beeb7e64ce578ef4020
hash passwords salt
3个回答
1
投票

随机盐的主要优点是,您不能对哈希表进行字典攻击,因为每个密码应该有不同的盐,因此“密码”和盐“jfadljfadiufosd38120809321”变成“Passwordjfadljfadiufosd38120809321”,这绝对不在预定义中。 - 计算字典 md5 哈希字典,因此您无法进行反向查找并找出用户密码。


0
投票

通过使用哈希,您可以限制密码中的字符。

哈希字符为:range(0,9) 和 range('a','f')。

字符越多越好。

如果密码要提交到网页,则符号不应包含sql注入中常用的符号。 (例如

",',%,\

要消除符号,请将
range('!','@')
更改为
range('0','9')

设置允许使用的字符和符号的数量和类型的标准。
该算法使用大写、小写、数字和符号。
长度为 32 个字符。

$characters = array_merge(
range('a','z'),
range('A','Z'),
range('!','@'));
shuffle($characters);
shuffle($characters);
$characters = array_flip($characters);
$ndx = 33;
$pass = '';
while($ndx-->1){
  $pass .= array_rand($characters);
}
echo $pass;

0
投票

取决于字符串的具体用法。

如果随机字符串是真正随机,那么用于立即使用,与散列和加盐字符串(相同字节长度)相比没有优势。

理论上hashed版本甚至可以比原始随机字符串“更少随机”,因为两个不同输入字符串的相同哈希字符串可能存在(实际上并不重要)。

但是,如果您通过网络发送字符串或将其存储在数据库中,您可能希望在某些情况下相同的字符串“看起来不同”。

加盐

相同的字符串总是产生相同的散列字符串。你可能不想要这样。

添加将使散列字符串始终不同,具有不同的盐(即使盐是已知的)。

例如

  • 相同的密码将作为相同的哈希字符串存储在两个不同的数据库中(因此知道其中一个数据库的黑客也知道另一个数据库,并且可能不知道原始密码)。
  • 通过网络发送时捕获的哈希密码可能会被攻击者再次发送。
  • 多次发送的相同哈希消息将始终是相同的字符串(这可以更容易猜测原始文本)。
  • ...

哈希

简单地散列随机字符串可以使其与原始字符串不同(带或不带盐)

例如您可以在授权过程中发送某些代码的散列版本,然后在不同的步骤中发送原始版本(只需由服务器再次散列即可验证它)

如果第一个哈希版本被攻击者拦截,攻击者仍然无法将其用于第二步。

(当然可以通过对已经散列的字符串进行散列来应用相同的原理。)

© www.soinside.com 2019 - 2024. All rights reserved.