使用 C# 解密 SHA1 值

本文关键字:SHA1 解密 使用 | 更新日期: 2023-09-27 17:56:56

>我有一个PHP网络服务,我发现它正在向我的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

使用 C# 解密 SHA1 值

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

单向散列的另一个例子是 MD5

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

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

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

为了解决这个问题,你永远不应该使用无盐哈希,即你总是使用你已知的值来自定义你的哈希。

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

现在你的哈希值很容易计算出来,但与世界上使用过sha1的其他人不同。

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

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

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

它似乎在做的是这样的:

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

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

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

哈希

不是可逆操作,就像加密一样。

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

您要查找的代码是这样的

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

其中 pin 是未哈希值,哈希是您想要配对的值