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)
12345 总是会以 8cb2237d0679ca88db6464eac60da96345513964 的形式出现,并带有直接哈希值。
这意味着,如果您为每个可能的结果创建一个数据库,理论上您可以查找结果,并从中了解 sha1 函数的原始输入是什么。
这是一个安全问题,可能会出现字典攻击和彩虹表等问题(http://en.wikipedia.org/wiki/Rainbow_table)。
为了解决这个问题,你永远不应该使用无盐哈希。也就是说,您总是使用您已知的值来自定义哈希值。
例如 sha1("12345" + "mySalt")。
现在你的哈希值对你来说很容易计算出来,但与世界上使用过 sha1 的其他人不同。
从技术上讲,您也不应该重复使用相同的盐两次,但这是一个更复杂的概念。
编辑:正如 owlstead 在下面指出的那样,应该使用 PBKDF2 和随机盐,而不是静态盐和哈希值。安全性要好得多。