在 C# 中反转 md5 哈希算法

本文关键字:md5 哈希 算法 | 更新日期: 2023-09-27 17:55:28

可能的重复项:
反转 MD5 哈希

在 c# 中给定此方法

public string CalculateFileHash(string filePaths) {
    var csp = new MD5CryptoServiceProvider();
    var pathBytes = csp.ComputeHash(Encoding.UTF8.GetBytes(filePaths));
    return BitConverter.ToUInt64(pathBytes, 0).ToString();
}

如何使用"DecodeFileHash"方法逆转此过程?

var fileQuery = "fileone.css,filetwo.css,file3.css";
var hashedQuery = CalculateFileHash(fileQuery); // e.g. "23948759234"
var decodedQuery = DecodeFileHash(hashedQuery); // "fileone.css,filetwo.css,file3.css"

其中解码查询 == 文件查询 最后。

这可能吗?如果不可能,是否有任何方法可以生成我可以轻松解码的哈希?

编辑:所以为了清楚起见,我只想压缩变量"fileQuery"并解压缩fileQuery以确定它最初是什么。自从散列/解码已经出来以来,有什么建议可以解决这个问题吗?

再次编辑:仅执行base64编码/解码听起来像是最佳解决方案。

public string EncodeTo64(string toEncode) {
    var toEncodeAsBytes = Encoding.ASCII.GetBytes(toEncode);
    var returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
}
public string DecodeFrom64(string encodedData) {
    var encodedDataAsBytes  = System.Convert.FromBase64String(encodedData);
    var returnValue = Encoding.ASCII.GetString(encodedDataAsBytes);
    return returnValue;
}

在 C# 中反转 md5 哈希算法

不可能。根据定义和设计,哈希不能恢复为纯文本或其原始输入。


听起来您实际上是在尝试压缩文件。如果是这种情况,这里有一个简单的方法可以使用GZip:

public static byte[] Compress( byte[] data )
{
    var output = new MemoryStream();
    using ( var gzip = new GZipStream( output, CompressionMode.Compress, true ) )
    {
        gzip.Write( data, 0, data.Length );
        gzip.Close();
    }
    return output.ToArray();
}

哈希派生自原始信息,但不包含原始信息。如果您想要一个较短的值来隐藏原始信息,但可以解析为原始值,您的选择相当有限:

  • 压缩原始信息。如果你需要一个字符串,那么你的原始信息必须相当大,以便压缩的base-64编码版本不会比原始数据更大。
  • 加密原始信息 - 这比仅仅压缩它更安全,并且可以与压缩相结合,但它也可能比原始信息更大。
  • 将原始信息存储在某处并返回查找密钥。

根据定义,加密哈希在典型的计算能力下是不可逆的。通常甚至不可能找到任何与原始输入具有相同哈希值的输入。

如果有超过 2^n 个不同的输入,则在数学上不可能返回原始输入。n 是哈希的位长(md5 为 128)。查一下皮金孔原理。

哈希不是无损压缩函数。

如果你想能够取回数据,你需要压缩,而不是散列。

您要做的是加密和解密...。

不是哈希和取消哈希,正如@Thomas指出的那样,这是不可能的。哈希通常使用彩虹表或其他一些数据集来击败,其中包括产生相同哈希的东西......不保证是输入值,只是哈希算法中产生相同输出的一些值。

Jeff Atwood在这里有一些很好的代码来理解加密:
http://www.codeproject.com/KB/security/SimpleEncryption.aspx

如果这对你有用

加密哈希(如 MD5)被设计为单向函数,也就是说,从中派生从中计算给定哈希的源数据在计算上是不可行的。然而,由于已经发现的弱点,MD5已经有一段时间不被认为是安全的:

关于MD5安全性的维基百科MD5被认为是有害的

MD5

的另一个弱点是,由于其相对较小的大小,已经发布了大型彩虹表,允许您查找给定的 MD5 哈希以获取将与指定哈希值冲突的源输入。