【问题标题】:Decrypt SHA1 value with C#用 C# 解密 SHA1 值
【发布时间】:2013-01-15 20:04:54
【问题描述】:

我发现我有一个 PHP Web 服务正在向我的 C# 传递一个 SHA-1 加密值。传递给我的示例数据是“8cb2237d0679ca88db6464eac60da96345513964”,我知道它转换为“12345”。

如何使用类似于以下的代码将哈希值转换回“12345”

public static string HashCode(string str)
{
string rethash = "";
try
{

      System.Security.Cryptography.SHA1 hash = System.Security.Cryptography.SHA1.Create();
       System.Text.ASCIIEncoding encoder = new System.Text.ASCIIEncoding();
       byte[] combined = encoder.GetBytes(str);
       hash.ComputeHash(combined);
       rethash = Convert.ToBase64String(hash.Hash);
}
catch (Exception ex)
{
       string strerr = "Error in HashCode : " + ex.Message;
}
return rethash;
}
  • 编辑 *

这里有一些 RUBY 代码,也可用于“8cb2237d0679ca88db6464eac60da96345513964”和“12345”

require "digest/sha1"
class User
  attr_accessor :password
  def initialize(password)
    @password = hash_password(password)
  end
  def hash_password(password)
    Digest::SHA1.hexdigest(password)
  end
  def valid_password?(password)
    @password == hash_password(password)
  end
end
u = User.new("12345")
p u.password # => "8cb2237d0679ca88db6464eac60da96345513964"
p u.valid_password?("not valid") # => false
p u.valid_password?("12345") # => true

【问题讨论】:

  • 我不是专家,但我认为你不应该这样做:P
  • SHA-1 是一种单向散列算法。它可以被任何旧的 C# 应用程序解密的那一天就是它不再有用的那一天。
  • 当我在互联网上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我发现很多人的“12345”值都被哈希为相同的值。
  • 当然它总是会散列到相同的值。您可以明确知道 8cb2237d0679ca88db6464eac60da96345513964 是 12345。不过,这不是解密。没有已知/实用的方法可以将任意散列值转换为原始值。

标签: c# encryption sha1


【解决方案1】:

您无法解密 SHA1 哈希,因为它是单向哈希。

另一种方式哈希的例子是 MD5

【讨论】:

  • 当我在互联网上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我看到很多人的“12345”值都被哈希到与我相同的值
  • 查看我的答案,了解为什么是@user2019423
【解决方案2】:

散列不是可逆操作,如加密。

【讨论】:

  • 当我在互联网上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我发现很多人的“12345”值都被哈希到与我相同的值。
  • @user2019423,确实 12345 总是散列到该值。也确实可能有其他值散列到该 sha。 “反转”散列的唯一方法是散列所有可能的值并查看哪些值映射到您的输入。
【解决方案3】:

散列不是加密。散列是一种方法,在大多数情况下用于验证数据完整性。

【讨论】:

  • 当我在互联网上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我发现很多人的“12345”值都被哈希到与我相同的值
  • 查看我的答案,了解为什么是@user2019423
【解决方案4】:

12345 将始终显示为 8cb2237d0679ca88db6464eac60da96345513964 并带有直接哈希。

这意味着,如果您为每个可能的结果创建了一个数据库,理论上您可以查找结果并从中查看 sha1 函数的原始输入是什么。

这是一个安全问题,可能会出现字典攻击和彩虹表等问题 (http://en.wikipedia.org/wiki/Rainbow_table)。

要解决这个问题,您永远不应该使用未加盐的哈希。即您始终使用您已知的值自定义哈希值。

例如 sha1("12345" + "mySalt")。

现在您的哈希值对您来说很容易计算,但与世界上所有使用过 sha1 的人不同。

从技术上讲,您也不应该重复使用相同的盐两次,但这是一个更复杂的概念。

编辑:正如 owlstead 在下面指出的,应该使用 PBKDF2 和随机盐,而不是静态盐和散列。安全性要好得多。

【讨论】:

  • 盐应该是随机的,你不应该使用散列,而是使用 PBKDF,例如 PBKDF2。
【解决方案5】:

您发布的 ruby​​ 代码似乎没有反转哈希值。

它似乎在做的是:

获取密码文本,对其进行哈希处理并存储。

稍后,当它想检查“用户”是否再次输入了相同的密码时,它会从用户那里获取密码文本,对其进行哈希处理,并将哈希值与存储的哈希值进行比较。

这是存储和检查密码的常用方法。不是“去散列”存储的值进行比较,而是散列新值并比较两个散列值。

【讨论】:

  • 这就是我需要了解的。谢谢!
【解决方案6】:

你要找的代码是这个

SHA1 sha = new SHA1CryptoServiceProvider();
ASCIIEncoding encoder = new ASCIIEncoding(); 
byte[] combined = encoder.GetBytes(pin);
string hash = BitConverter.ToString(sha.ComputeHash(combined)).Replace("-", "");

其中 pin 是未散列的值,hash 是您要比较的值

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 2022-11-16
    • 2015-05-25
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2016-10-22
    相关资源
    最近更新 更多