在存储之前对哈希字符串进行某种非破坏性后处理(重新排序)是一个好主意吗?例如:
$hash = strrev(hash($algo, $data . $salt));
其他例子:
$hash = hash($algo, $data . $salt)
$hash = strrev(substr($hash, 0, (int) ($length / 2))) . strrev(substr($hash, (int) ($length / 2)));
而不仅仅是:
$hash = hash($algo, $data . $salt);
换句话说:
考虑到断路器不知道哈希是如何变换的,前两个例子会比第三个例子产生更少易碎的哈希吗?
我不说我会strrev
我的哈希,这只是我能想到的最简单的例子来说明什么"非破坏性的"在这种情况下意味着:在不减少算法的密钥空间的情况下对哈希进行后处理。
回答我不寻找:
hash(hash(hash($data)))
- 问题不是关于重新发布回答我实际上在寻找:
这是(不是)一个好主意,因为......原因......这里有一些关于为什么你应该(不应该)这样做的例子:......例子......另外,请阅读这个......论文,文章,帖子,链接到研究......这证明了我的观点。
答案 0 :(得分:1)
让我们尝试分析所提出的算法,好像"非破坏性后处理"是一个秘密的功能,取自某些可能的功能空间。
在此视图中,后期处理有点像键,整体算法是键控哈希(如HMAC)。以下是该算法的一些要点。
密钥哈希可以抵抗已知明文攻击:如果攻击者知道许多后处理哈希的输入值,那么仍然很难找到"密钥"。但是,如果后期处理很简单,例如您的示例中的strrev
,攻击者可能很容易找出"键"。
您必须仔细设计这些功能的空间。
编辑:如何将块密码应用于哈希结果?至少就是这样,你可以充分利用非破坏性功能的良好审查空间。