C# 用C解密SHA1值#

C# 用C解密SHA1值#,c#,encryption,sha1,C#,Encryption,Sha1,我发现一个PHP web服务正在传递我的C#a SHA-1嵌入值。传递给我的示例数据是“8cb2237d0679ca88db6464eac60da96345513964”,我知道这会转换为“12345” 如何使用类似于以下代码将哈希值转换回“12345” public static string HashCode(string str) { string rethash = ""; try { System.Security.Cryptography.SHA1 hash = Sys

我发现一个PHP web服务正在传递我的C#a 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;
}
  • 编辑*
下面是一些与“8cb2237d0679ca88db6464eac60da96345513964”和“12345”一起工作的RUBY代码


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


单向散列的另一个例子是MD5,散列与加密一样不是可逆操作。

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

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

这意味着,如果你建立了一个包含所有可能结果的数据库,理论上你可以查找结果,从中可以看出sha1函数的原始输入是什么

这是一个安全问题,可能会出现字典攻击和彩虹表之类的问题()

为了避免这种情况,你不应该使用无盐散列。i、 你总是使用你知道的值来定制你的散列

例如sha1(“12345”+“mySalt”)

现在,您可以很容易地计算出哈希值,但与世界上使用sha1的其他人不同

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


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

您发布的ruby代码似乎没有反转散列

它似乎在做的是:

获取密码文本,将其散列并存储

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


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

您要查找的代码如下

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

其中,pin是未剪切的值,hash是您想要比较的值

我不是专家,但我认为您不应该这样做:PSHA-1是一种单向哈希算法。当我在互联网上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我发现很多人都将“12345”值哈希为相同的值。当然,它总是哈希为相同的值。您可以明确知道8cb2237d0679ca88db6464eac60da96345513964是12345。但这并不是解密。没有已知/实用的方法将任意散列值转换为原始值。当我在internet上搜索“8cb2237d0679ca88db6464eac60da96345513964 12345”时,我发现很多人将“12345”值全部散列为与我相同的值。@user2019423,12345确实总是将该值散列。同样,可能还有其他值散列到该sha。“反转”散列的唯一方法是散列所有可能的值,并查看哪些值映射到您的输入。当我在互联网上搜索“8CB2237D0679CA88DB64EAC60DA96345513964 12345”时,我看到很多人将“12345”值全部散列到相同的值,我在互联网上搜索时看到了我的答案,为什么是@user2019423“8cb2237d0679ca88db6464eac60da96345513964 12345”我看到很多人都将“12345”值散列为相同的值,我看到了我的答案,为什么是@user2019423这是我需要理解的。谢谢!盐应该是随机的,你不应该使用散列,而应该使用PBKDF,比如PBKDF2。
SHA1 sha = new SHA1CryptoServiceProvider();
ASCIIEncoding encoder = new ASCIIEncoding(); 
byte[] combined = encoder.GetBytes(pin);
string hash = BitConverter.ToString(sha.ComputeHash(combined)).Replace("-", "");