【问题标题】:Verifying salted hashes with Perls unpack()使用 Perls unpack() 验证加盐哈希
【发布时间】:2010-12-18 12:19:07
【问题描述】:

我正在尝试使用 Perl 验证加盐密码,但无法解压。

我有一个加盐哈希密码,例如对于 SHA256:SSHA256 = SHA256('password' + 'salt') + 'salt' Base64 编码得到 ' {SSHA256}eje4XIkY6sGakInA+loqtNzj+QUo3N7sEIsj3fNge5lzYWx0'。

我将此字符串存储在我的用户数据库中。当用户登录时,需要将盐与哈希分开,以使用盐对提供的密码进行哈希处理,并将结果与​​从数据库中检索到的结果进行比较。这就是我卡住的地方。我似乎没有正确的解包模板将哈希(8 位二进制,固定长度,在本例中为 32 字节)与盐(8 位二进制,可变长度)分开。

我尝试过类似
my ($hash, $salt) = unpack('N32 N*', $data);
但这似乎行不通。

我的问题是:我怎样才能解压这个哈希(在它被 Base64 解码之后)以得到一个固定长度的哈希和另一个变量的可变长度盐?

【问题讨论】:

    标签: perl hash passwords unpack


    【解决方案1】:

    我认为你是在不必要地重新发明轮子。

    你可以使用例如Crypt::SaltedHash 方便验证,例如:

    我的 $password_entered = $cgi->param('password'); 我的 $valid = Crypt::SaltedHash->validate($salted, $password_entered);

    一个更长的例子,展示了在第一个实例中使用 Crypt::SaltedHash 来生成加盐密码:

    我的 $csh = Crypt::SaltedHash->new(algorithm => 'SHA-256'); $csh->add('secretpassword'); 我的 $salted = $csh->generate; # $salted 将包含加盐哈希(Crypt::SaltedHash 随机选择 # 自动为你加盐) # 例如: DB x $salted = $csh->generate; 0 '{SSHA256}H1WaxHcyAB81iyIPwib/cCUtjqCm2sxQNA1QvGeh/iT3m51w' # 验证明文'secretpassword'表明它是正确的: DB x Crypt::SaltedHash->validate($salted, 'secretpassword'); 0 1 # 并尝试使用错误的密码: DB x Crypt::SaltedHash->validate($salted, 'wrongpassword'); 0''

    没有理由自己重新发明所有这些。

    【讨论】:

    • 这个模块没有做我需要做的事情,但总的来说它可能值得再看一下。
    • 它不能帮助您将盐与盐分哈希密码分开,不,但正如我所说,我认为您最好让 Crypt::SaltedHash 负责比较哈希密码你。它已经过试验和测试,人们重新发明与安全相关的代码总是让我感到紧张 :) 然而,TIMTOWDI 一如既往!
    【解决方案2】:

    您似乎在艰难地执行 RFC2307,并且还设法引入了错误。那些+ 并不代表你的想法。

    改为子类Authen::Passphrase::SaltedDigest

    【讨论】:

      【解决方案3】:

      不确定整个图片是否存在,但您指定的 unpack 模板 -'N32 N*'- 适用于 32 个 unsigned long(32 位)(大端)整数(@ 987654321@).

      看起来您可能需要无符号字符:'32C C*'

      【讨论】:

      • 谢谢,最终这导致了我的解决方案。
      猜你喜欢
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2012-05-03
      • 2021-12-12
      相关资源
      最近更新 更多