是否可以从另一个哈希中提取某种“提示哈希”?

信息安全 哈希 钥匙
2021-08-16 02:15:32

我是一名网络开发人员,开始涉足密码学,所以请在这方面与我裸露...

假设我有一组从一些常见数据(即对多条记录的更改)生成的哈希值。有没有一种方法可以从主散列生成辅助散列,并根据主散列的生成方式将其与其他散列进行比较。例如...

plain text             | hash      | hint hash
----------------------------------------------
"USER:123:fName:Alice" | 92eb5ff.. | 3cd24
"USER:123:fName:alice!"| 1c77753.. | 3cd24
"USER:456:fName:Bob"   | fee6ae2.. | 7d28e
"USER:456:fName:bob!"  | 7775315.. | 7d28e
"USER:789:fName:Carl"  | fec3ad7.. | 75315

请注意所有散列是如何唯一的,但提示散列与它们从中散列的记录 ID 匹配。因此,如果我根据纯文本和一些密钥生成这些哈希,即 genHash(plainText, keyText)。如果您只有散列,则可以仅通过提示散列关联哪些散列彼此相关。因此,如果我只有哈希,我仍然可以通过几个 getHintHash(hash) 调用找到它们的关联......

哈希表:

hash      
---------
92eb5ff.. 
1c77753..
fee6ae2..
7775315.. 
fec3ad7..

带有提示哈希的哈希表:

hash      | hint hash
----------------------
92eb5ff.. | 3cd24
1c77753.. | 3cd24
fee6ae2.. | 7d28e
7775315.. | 7d28e
fec3ad7.. | 75315

现在我有了唯一哈希之间的关系,而没有暴露生成它们的纯文本。这可能吗?请记住,散列函数得到了明文和“提示散列”可以基于的密钥......

genHash("USER:123:fName:Alice", "USER:123") -> 92eb5ff..
2个回答

您需要一个方案,其中仅给定哈希值,您可以计算两个哈希是否指向同一用户。这是一个相当复杂的问题,所以它有一个相当复杂的答案。首先,让我们确保我们都同意条款:

定义:哈希

散列函数是可用于将任意大小的数据映射到固定大小的数据的任何函数。[维基百科/Hash_Function]

例如,首字母是一个完全有效的散列函数(John Smith --> JS, Christina Secretmessagewriter --> CS),尽管它对密码学没有好处,因为它在隐藏方面没有多大作用。

Def'n加密哈希

密码散列函数是一种数学算法,它将任意大小的数据映射到固定大小的位串(散列函数),它也被设计为单向函数,即无法反转的函数。[维基百科/Cryptographic_Hash_Function]

如果您单击“单向函数”并在兔子洞中走得足够远,您会发现加密哈希必须与随机无法区分,这意味着如果我给您两个哈希,则无法获得任何排序关于这两个输入是否相关的任何信息(另一个可在谷歌上搜索的术语是“雪崩效应”)。

因此,根据定义,您想要的与加密散列函数的想法不符——其目标是防止任何信息泄露。


根据您对信息泄漏的关心程度,答案可以继续。

您所要求的是将哈希提示嵌入到整个哈希中,以便可以再次提取它。这里没有真正的安全性,因为如果你能做到,那么了解你系统的攻击者也能做到,但还是让我们探索一下吧。

实现此目的的一种方法是分别对USER:123fName:Alice部分进行散列并将它们连接起来以形成整体散列。然后,您的“哈希提示”只是整个哈希的前半部分(如果您使用不同大小的哈希,则为前 N 个字符)。它满足getHintHash(hash)从整体散列中提取散列提示的要求,并且允许您将相关记录关联在一起,而无需实际暴露明文。

您可以通过发明自己的非加密哈希函数来做更复杂的事情,该函数将提示传播到按摩而不是将其粘贴在前面(可能通过一些聪明的数学或使用速记袋中的技巧),但它是不清楚这会给你带来什么。

归根结底,您可能会通过隐匿获得一些安全性,并且您可能能够将哈希压缩得更小,但这实际上相当于连接两个哈希。

从您的帖子中我不清楚GetHintHash是数据检索操作还是纯计算功能。

如果您要问,“我可以设计一个数据存储系统,其中包含提示哈希,可以通过一个名为的函数从存储中检索,GetHintHash(hash)这将允许我检索相关的记录?” 那么是的,显然,您刚刚描述了这样一个系统。

如果你问,“我可以写一个函数来告诉我两个哈希是否来自相似的明文,除了两个哈希之外没有其他数据?” 答案是否定的,除非你的哈希函数很烂。您要求与下面的粗体项目符号相反:

理想的密码散列函数有四个主要属性:

  • 可以快速计算任何给定消息的哈希值

  • 除非尝试所有可能的消息,否则从其哈希值生成消息是不可行的

  • 对消息的一个小改动应该会如此广泛地改变哈希值,以至于新的哈希值看起来与旧的哈希值不相关

  • 找到具有相同哈希值的两条不同消息是不可行的

(来源:维基百科