我有兴趣找到一种可以将一段数据编码成一种哈希值的算法(因为除了暴力之外不可能转换回源数据),但也有一个独特的输出每个独特的输入。输出的大小无关紧要。
它应该能够对相同的输入进行两次哈希,并给出相同的输出,因此使用随机丢弃的密钥进行常规加密是不够的。也不会使用已知的密钥或盐进行常规加密,因为它们会暴露给攻击者。
这样的事情存在吗?
理论上是否存在事件,或者正常哈希算法的数据破坏部分是否对不可逆特征至关重要?
这样的东西有什么用?好吧,想象一个浏览器,其中包含应从历史记录中排除的网站列表(如NSFW网站)。如果使用系统上已知的密钥对此列表进行未编码或加密保存,则不仅可以通过浏览器阅读,还可以通过老板,妻子等阅读。
如果网站地址存在散列,则无法读取,但浏览器可以检查列表中是否存在网站。
使用普通哈希函数可能会导致误报(但不太可能)。
我没有构建浏览器,我没有计划实际使用答案。我只是好奇并对加密等感兴趣。
答案 0 :(得分:2)
理论上,输出短于输入是不可能的。这很简单地遵循皮江孔原理。
您可以在丢弃私钥的地方使用非对称加密。这样它在技术上是无损加密,但没有人能够轻易地逆转它。请注意,这比正常散列多慢,输出将大于输入。
但是碰撞的概率随着散列大小呈指数下降。出于所有实际目的,良好的256位散列是无冲突的。而且我的意思是哈希数十亿年,世界上所有的计算机几乎肯定不会产生碰撞。
您的扩展问题显示了两个问题。
这样的东西有什么用?好吧,想象一个浏览器,其中包含应从历史记录中排除的网站列表(如NSFW网站)。如果使用系统上已知的密钥对此列表进行未编码或加密保存,则不仅可以通过浏览器阅读,还可以通过老板,妻子等阅读。
如果网站地址存在散列,则无法读取,但浏览器可以检查列表中是否存在网站。
在这个用例中,蛮力是微不足道的。只需找到所有域/区域文件的列表。如果一个好的列表可以在某处下载,那就不会感到惊讶。
使用普通哈希函数可能会导致误报(但不太可能)。
哈希的冲突概率要低得多(特别是因为你没有试图在这种情况下引发冲突的攻击者)而不是硬件错误的概率。
所以我的结论是将秘密与慢速哈希相结合。
byte[] secret=DeriveKeyFromPassword(pwd, salt, enough iterations for this to take perhaps a second)
然后对于实际哈希使用KDF再次组合秘密和域名。
答案 1 :(得分:2)
给定哈希的定义;
不,这在理论上是不可能的。散列值具有固定长度,该长度通常小于其散列的数据(除非散列的数据小于散列的固定长度)。它们总是会丢失数据,因此总会发生冲突(如果碰撞风险很低,则哈希函数被认为是好的,计算是不可行的。)加密散列函数是一个确定性过程,它接受任意数据块并返回固定大小的位串(加密)散列值,这样对数据的偶然或有意更改将改变散列值。
答案 2 :(得分:1)
任何形式的无损公共加密,您忘记了私钥。
答案 3 :(得分:1)
好吧,任何带密码的无损压缩器都能正常工作。
或者您可以使用某些已知(对您)的文字salt输入。这会给你一些与输入一样长的东西。然后,您可以对结果运行某种无损压缩,这会缩短它。
答案 4 :(得分:1)
你可以找到一个发生概率很低的哈希函数,但我认为它们都倾向于birthday attack,你可以尝试使用具有大尺寸输出的函数来最小化这种概率
答案 5 :(得分:0)
那么md5哈希呢? sha1哈希?
答案 6 :(得分:0)
我不认为它可以存在;如果你可以把任何东西放进去并获得不同的结果,它就不能是一个固定长度的字节数组,它会失去很多用处。
也许您正在寻找的是可逆加密而不是哈希?这应该是独一无二的。不会快,但它将是唯一的。