使用C#解密SHA1值

use*_*423 4 c# encryption sha1

我发现有一个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;
}
Run Code Online (Sandbox Code Playgroud)
  • 编辑*

这是一些与“ 8cb2237d0679ca88db6464eac60da96345513964”和“ 12345”一起使用的RUBY代码。

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
Run Code Online (Sandbox Code Playgroud)

Avi*_*tus 5

您不能解密SHA1哈希,因为它是单向哈希。

另一种单向散列的示例是MD5


Kin*_*nus 5

12345 总是会以 8cb2237d0679ca88db6464eac60da96345513964 的形式出现,并带有直接哈希值。

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

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

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

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

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

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

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

  • 盐应该是随机的,并且不应使用哈希值,而应使用 PBKDF,例如 PBKDF2。 (3认同)