【问题标题】:Get Matching SHA256 Algorithm - Perl获取匹配的 SHA256 算法 - Perl
【发布时间】:2015-04-23 16:48:48
【问题描述】:

您好,我正在尝试生成一个类似的 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。这是我的一个项目,是为了防止暴力破解。
  • 我不确定我是否理解。澄清一下,您希望generateHash( "ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae", "fx4;)@?%" ) 的输出为"test123"
  • 不,我希望它是ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae
  • 你当然可以只返回第一个参数。您认为encryptPass 函数中的哪一部分操作正在反转哪个哈希?您可能对安全哈希加密/解密数据有误解——它们不会。哈希是单向函数,不可能倒退,只能通过蛮力猜测。

标签: perl sha


【解决方案1】:

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

听起来您想找到第二个字符串,该字符串将散列到与 test123 散列到的散列值相同的散列值。这种类型的目的首先是使用 SHA。

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

这是另一篇与暴力破解 SHA-512 相关的帖子,它在算法上实际上等同于 SHA-256。链接的帖子是 Java 而不是 Perl,但这些概念与语言无关。 How long to brute force a salted SHA-512 hash? (salt provided)

【讨论】:

  • @user2524169:您对安全哈希的使用和行为的误解将使您的登录代码不安全 - 与您的意图相反。寻找预先打包的东西,例如Authen::Passphrase(将其与 bcrypt 算法一起使用,您将对暴力破解有一些很好的防御)
  • 散列是一个“单向”过程。它们的设计目的不是能够对散列的原始值进行逆向工程。而且这样做越容易,即越容易创建一个哈希到特定哈希值的字符串,哈希算法就越差。
  • 这就是人们对多次不成功的身份验证尝试实施锁定或时间延迟以避免暴力破解的原因。比较密码的正确和标准方法是将提交的密码的散列值与数据库上的散列版本进行比较。对哈希值进行逆向工程并不是一个真正的好方法。
  • 此外,客户端通常不会发送密码的散列版本,他们会发送明文(通过加密的通信协议),服务器端会对其进行散列 - 这允许服务器也应用适当的盐渍策略。可以发送散列或加密版本 - 但有一些注意事项。
  • @user2524169:请展示您的 MD5 代码是如何工作的,这将有助于澄清您的需求。我怀疑它是否完全一样。另外请更新您的示例输出,它仍然与您的代码不匹配,因此很难理解您。您现有的脚本不能用于我可以看到的任何目的。
【解决方案2】:

您严重误解了哈希的用途。这是一条单向设计的街道。它还被设计成具有非常低的“冲突”概率 - 两个源值散列到相同的结果。我所说的“非常低”是指“出于实际目的,它没有”。受约束的字符串(例如密码)根本不会这样做。

那么密码通常会发生什么 - 我的客户端获取我的密码,生成一个哈希,然后将它发送到服务器。

服务器将它与它的列表进行比较 - 如果哈希匹配,我们假设我的密码是正确的。这意味着我的密码绝不会“以明文形式”发送,也无法通过抓取哈希来计算出密码。

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

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

但是暴力破解哈希是设计一个昂贵的尝试。您将看到存在“彩虹表”的地方,人们获取了每个有效的密码字符串并对其进行哈希处理,因此他们可以快速破解从服务器检索到的哈希值。这些很大,虽然最初需要很长时间才能生成,但至少部分通过将用户名加盐或嵌入到哈希中而被击败。

但我无法足够强烈地重复一遍 - 除非您真的确定发生了什么,否则永远不要手动滚动您自己的安全性。你会建立你甚至不知道存在的弱点,而你唯一的“安全感”是没有人费心去看。

【讨论】:

    【解决方案3】:

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

    将密码转换为您存储的内容的正确方法是使用 PBKDF,例如“bcrypt”(基于密码的密钥派生函数)。

    查看 Digest::Bcrypt

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

    【讨论】:

    • 鉴于 bcrypt 算法是基于散列算法的,我不确定您的“注意事项”?无论哪种方式,虽然这是存储身份验证数据的好建议,但它是否解决了 OP 的问题并不太清楚,作为评论可能会更好。
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多