如何使用C#解密哈希值?

3

有人可以反向解析我正在使用的这个便捷的哈希码吗?

using System.Security.Cryptography;

public static string EncodePasswordToBase64(string password)
{  byte[] bytes   = Encoding.Unicode.GetBytes(password);
   byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes);
   return Convert.ToBase64String(inArray);
}

我所做的每件事情都失败得很惨 :(。

4个回答

22

不行,你不能反向哈希一个值。通常的做法是将其他输入与你拥有的哈希值进行比较,检查它们是否相同。

类似于(伪代码):

initial  = Hash(password);
possible = Hash("test");

if( initial == possible ){
    // we infer that password = "test"
}

请注意,由于各种程度的漏洞,SHA1、SHA0和MD5不应再使用。你应该使用SHA-2


Silky说得一点也没错,哈希是单向的,你只能通过暴力选项来反转它。 - Joanne C
哈希函数不一定是单向的。例如,Python 中的 hash(1) = 1,这显然是可逆的。只有当输出字符串的大小小于输入字符串的大小时,哈希才是单向的。 - Falaina
1
Falaina: 当然,但有两点需要注意:'哈希'的定义是将输入缩小到更小的东西(http://en.wikipedia.org/wiki/Hash_function),而加密哈希(上下文;根据这个问题)是设计为不可逆的(http://en.wikipedia.org/wiki/Cryptographic_hash_function#Properties)。 - Noon Silk

5
唯一真正的“反哈希”方法是使用彩虹表,这是一个大的哈希表格,为所有可能的输入计算出哈希值。在表中查找哈希值,可以得出最有可能是原始输入的内容。 http://en.wikipedia.org/wiki/Rainbow_table

4
这就是为什么在存储敏感数据的哈希值之前,重要的是对其进行加盐处理。http://en.wikipedia.org/wiki/Salt_(cryptography) - Mark Rushakoff

1

很遗憾,您无法取消哈希SHA1、MD5或任何其他单向哈希方法。虽然可以撤销BASE-64。


哈希不是加密,它是哈希。加密使用密钥并且是可逆的。 - Noon Silk

0

SHA是NSA的首字母缩略词,代表“安全哈希算法”。

安全哈希算法在定义上难以被逆转 —— 否则它们就不会是安全的。

如果你想要能够轻松计算相同哈希值的源代码,那么你需要使用可逆哈希函数(即使这样做也可能由于哈希冲突而无法获得原始源代码,因为多个源输入可以导致相同的哈希输出)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接