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

Random string vs hashed and salted string

假设我想创建一个完全随机的密码,将其命名为 randPass,大小为 32 个字符。

就安全性而言,直接将其用作密码与散列和加盐相比是否有任何优势(如 md5(randPass + salt)

我的意思是在一天结束时,它们都是 32 个字符长的随机字符。

这是一个虚拟示例:

salt = SFZYCr4Ul1zz1rhurksC67AugGIYOKs5;
randPass = VgQK1AOlXYiNwfe74RlU8e8E4szC4UXK;

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

hash = dddbc2cbda808beeb7e64ce578ef4020

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

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

散列字符为:range(0,9) and 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;