0

我正在使用以下代码来学习/熟悉单向密码加密、加盐和使用它们来验证用户登录。

它有效,我将散列密码和盐值存储在我的数据库中,我可以检索两者并与纯文本密码进行比较,没问题。

我的问题是关于输出、它的安全性等。

use Digest::SHA3;

$plaintextpassword='cheeseburgerandfries';

$salts = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

$s1a = rand(62);
$s1b = rand(62);
$s1c = rand(62);
$salt = substr($salts,$s1a,1).substr($salts,$s1b,1).substr($salts,$s1c,1);

$sha1 = Digest::SHA3->new;
$sha1->add($salt.$plaintextpassword);
$encpw = $sha1->hexdigest;

这给出了类似于

$encpw='7fd7d6e9b574fe6306be6c709d23050b5ad28f07e094403469229b6d'

当我获取该值并通过文本到字节转换器(在线)运行它时,我得到

00110111 01100110 01100100 00110111 01100100 00110110 01100101 00111001 01100010 00110101
00110111 00110100 01100110 01100101 00110110 00110011 00110000 00110110 01100010 01100101
00110110 01100011 00110111 00110000 00111001 01100100 00110010 00110011 00110000 00110101
00110000 01100010 00110101 01100001 01100100 00110010 00111000 01100110 00110000 00110111
01100101 00110000 00111001 00110100 00110100 00110000 00110011 00110100 00110110 00111001
00110010 00110010 00111001 01100010 00110110 01100100

我相信是160位。因为我对哈希和位真的很陌生,所以我很困惑。

我的想法是 SHA3 是 256 位及以上,那么为什么输出是 160 位。我什至可能误解了数据,甚至是我从研究中收集到的信息,所以请原谅我。

另外,我确信有更容易/更好/更强/任何方式来实现我的目标,但我认为我的问题更多的是理解位长度等。

另外,我读到最好使用等于输出字符长度的盐值长度,这意味着我的盐值将是 56 个字符,就像我上面的 SHA3 输出一样?我正在考虑使用一些基本的东西,例如


$salts = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

$sv=0;

while ($sv<56) {

$s1 = rand(62);

$newsalt = $newsalt.substr($salts,$s1,1);

$sv++;
}

$salt = $newsalt;

我确实读过一些可以给我真正随机盐值的模块,我对这些很感兴趣,但是我的 while 循环似乎正在完成任务,但是没有必要使用 56 个字符的盐值。

任何帮助和指导都会很甜蜜。谢谢!

  • 产生
4

1 回答 1

1

您提供的散列大小为 224 位(不是 160)。

该模块的摘要说

该模块为 Perl 程序员提供了一种方便的方法来计算 SHA3-224、SHA3-256、SHA3-384 和 SHA3-512 消息摘要,以及使用 SHAKE128 和 SHAKE256 的可变长度哈希。

维基百科确认这些(224、256、384 和 512)是标准尺寸。

如果您想获得特定尺寸,请使用

use Digest::SHA3 qw( );

my $sha3 = Digest::SHA3->new(XXX)
$sha3->add(...);
my $hash = $sha3->hexdigest;

或者

use Digest::SHA3 qw( sha3_XXX_hex );

my $hash = sha3_XXX_hex(...);

使用适当数量的位数而不是XXX.

于 2021-01-14T05:48:45.770 回答