获取匹配的SHA256算法-Perl



嗨,我正在尝试生成一个类似的sha256十六进制,但似乎找不到匹配的。我想使用随机密钥生成几乎任何密码。

在这种情况下,我使用test123:ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae

这是我的代码:

 print "Final Hash: " . generateHash("ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae", "fx4;)@?%") . chr(10);
 sub generateHash {
   my ($strPass, $strLoginKey) = @_;
   my $strHash = encryptPass(uc($strPass), $strLoginKey);                            
   return $strHash;
 }
sub encryptPass {
   my ($strPassword, $strKey) = @_;
   my $strSalt = 'Y(02.>'H}t":E1';
   my $strSwapped = swapSHA($strPassword);
   print "First Swap: " . $strSwapped . chr(10);
   my $strHash = sha256_hex($strSwapped . $strKey . $strSalt);
   print "Hashed Into: " . $strHash . chr(10);
   my $strSwappedHash = swapSHA($strHash) . chr(10);
   print "Last Swapped: " . $strSwappedHash . chr(10);
   return $strSwappedHash;
}
sub swapSHA {
   my ($strHash) = @_;
   my $strSwapped = substr($strHash, 32, 32);
   $strSwapped .= substr($strHash, 0, 32);
   return $strSwapped;
}

如有任何帮助,我们将不胜感激!

我得到的输出:

Original Hash: ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae Hashed Into: 34b6bdd73b3943d7baebf7d0ff54934849a38ee09c387435727e2b88566b4b85 Last Swapped: 49a38ee09c387435727e2b88566b4b8534b6bdd73b3943d7baebf7d0ff549348 Final Hash: 34b6bdd73b3943d7baebf7d0ff54934849a38ee09c387435727e2b88566b4b85

我正试图使输出具有与输入相同的最终值

Final Hash: ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae

我想通过反转"Hashed Into"值来实现这一点。

SHA作为一种哈希算法,旨在防止冲突。也就是说,它的部分功能和有用性在于限制将散列到相同结果值的字符串。

听起来你想找到第二个字符串,它将散列到与test123散列到的值相同的散列值。这种方法首先符合使用SHA的目的。

可以使用SHA强制执行值,即给定一个哈希值,您可以通过计算哈希并将哈希值与目标值进行比较来强制执行哈希值。这需要一些时间。其他算法,如bcrypt,更难使用暴力,但对您来说计算成本也更高。

这里是另一篇关于暴力强迫SHA-512的帖子,它在算法上实际上等同于SHA-256。链接的帖子是Java,而不是Perl,但这些概念与语言无关。一个腌过的SHA-512哈希需要多长时间?(提供盐)

您严重误解了哈希的含义。这是一条单向设计的街道。它还被设计为具有非常低的"碰撞"概率——两个源值散列到相同的结果。我所说的"非常低"是指"出于实际目的,它不是"。一个受约束的字符串——比如密码——根本做不到

因此,密码通常会发生什么——我的客户端获取我的密码,生成一个哈希,并将其发送到服务器。

服务器将其与列表进行比较——如果哈希匹配,我们就认为我的密码是正确的。这意味着我的密码在任何时候都不会被"清除",也不可能通过获取哈希来计算出它是什么。

为了避免重复出现(例如,两个密码相同的人),通常你会对一些唯一的值进行散列。简单地说,当散列时,用户名+密码。

针对哈希进行身份验证的目的是确保明文密码永远不需要保存在任何地方——仅此而已。你仍然需要保护你的通信通道(以避免重播攻击),你仍然需要防止暴力猜测密码。

但暴力哈希在设计上是一件昂贵的尝试。你会看到"彩虹表"存在的地方,人们已经获取了每个有效的密码字符串,并对其进行了哈希处理,这样他们就可以快速破解服务器上检索到的哈希。这些都很大,最初生成需要很长时间,并且至少部分通过在哈希中添加或嵌入用户名而失败。

但我再怎么强调也不为过-除非你真的确定发生了什么,否则永远不要手动滚动你自己的安全性。你会建立你甚至不知道存在的弱点,而你唯一的"安全性"是还没有人愿意去看。

您不应该这样做。它不安全,容易受到字典攻击。

将密码转换为存储内容的正确方法是使用类似PBKDF的"bcrypt"(基于密码的密钥派生函数)。

查看摘要::Bcrypt

注意:如果有人告诉你(或帮助你)使用"哈希"存储密码,他们对安全或加密一无所知。对他们微笑,然后忽略他们接下来说的一切。

最新更新