免责声明:我知道哈希不是假设的是可逆的。
我见过很多人问是否有办法“解开”已经散列过的文本。但是,我没有看到一个直接的答案。大多数答案都说MD5和SHA-1是单向散列算法,因此是不可逆转的。这一切都很棒,但问题是所有散列算法单向且不可逆转?
答案 0 :(得分:4)
散列函数是可用于将任意大小的数据映射到固定大小的数据的任何函数。 (来源:Wikipedia)
因为输入值的范围是无限的并且可能的不同输出值的数量是有限的,所以该函数为无限数量的输入值产生相同的输出。这意味着哈希是一种丢失信息函数。
假设有人可以反转"在散列中,它们将获得无限的可能原始值。仍然无法确定用于生成散列的值是什么。
在数学术语中,哈希函数不是injective,此属性自动使其不是invertible。
以上所有内容均适用于任何哈希函数,无论使用何种语言或库提供。
答案 1 :(得分:3)
不是真的。散列函数的一个绝对不可协商的属性是它将任意长度的数据转换为固定长度的值。这意味着您的散列函数的每个可能结果都有无限多个可能产生它的输入,使哈希函数反转为单个值是不可能的。
如果您可以对数据输入的长度设置约束,那么从技术上讲,您可以定义可逆散列函数,但我并不特别看到它的用途。
答案 2 :(得分:2)
...所有散列算法都是单向且不可逆的吗?
有一些真实的散列函数可以可以被反转,例如通过返回输入不变来名义上散列8,16,32或64位数的非常见实现。许多C ++标准库,python和其他语言都是这样做的,因为它通常足够好用于键入数字的哈希表 - 必须权衡冲突的额外可能性。生成更强哈希所需的时间,甚至附近密钥的潜在CPU缓存优势也可以散列到附近的桶中。
那就是说,你的问题就开始......
我看到很多人都在问是否有办法解决问题"已经哈希的文字。
对于非常短的文本,例如8个字符的密码,使用字典和变异规则的暴力攻击(例如"尝试字典单词后跟每个字符从空格(ASCII 32)到tilda(127)& #34;,"尝试用相似或相似的数字替换字母的所有组合" ...)有时可以找到使用的密码 (尽管有' sa很有可能它是另一个具有相同哈希值的密码。)
如果输入不是基于词典单词或其他可猜测的内容,则它不太可能被破解。
对于较长的文本数量,找到具有匹配哈希值的任何输入越来越不切实际,并且任何此类输入实际上不太可能是最初用于生成hash(输入较长,其中更多将 - 平均 - 映射到任何给定的哈希值)。一旦文本输入比散列值长几十倍,它就完全不切实际(除非量子计算可能显着发展)。 (请注意,Microsoft的C ++编译器std::hash<std::string>
仅沿着任意字符串均匀分隔10个字符以形成哈希值,因此较长的字符串不会提高哈希的质量,但是另一方面,散列只提供了对形成它的最多10个字符的任何见解。
大多数答案都说MD5和SHA-1是单向散列算法,因此是不可逆转的。
适合加密使用的哈希(与哈希表的使用不同) - 本身应该花费相对较长的时间来计算(在可能的硬件上只有一小段时间),因此上面提到的暴力词典攻击令人望而却步计算密集型,即使是短文本字符串。这有助于使它们几乎不可逆转。在输入的字节数多于哈希值中的字节数后,即使合理的校验和强度哈希函数也很难反转,随着输入变得越来越大,它们几乎不可逆转。