Security 无损哈希后处理是一个好主意吗?

Security 无损哈希后处理是一个好主意吗?,security,hash,Security,Hash,在存储之前对散列字符串进行某种非破坏性的后处理(重新排序)是一个好主意吗?例: $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($a

在存储之前对散列字符串进行某种非破坏性的后处理(重新排序)是一个好主意吗?例:

$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);
换言之:

考虑到破坏者不知道散列是如何转换的,前两个示例会比第三个示例产生更少的可破坏者散列吗

我不是说我将
strev
我的散列,这只是我能想到的最简单的例子来说明“非破坏性”在这个上下文中的含义:在不减少算法密钥空间的情况下对散列进行后期处理

我不在寻找的答案:

  • 伙计,用盐来避免raimbow桌子之类的-彩虹桌子是相关的
  • 只需像这样重新设置哈希值(hash(hash($data))——问题不在于重新设置哈希值
  • 请不要使用你自己的密码-这不是我要说的
  • 不要运行你自己的加密这也于事无补
我实际上在寻找的答案是:

这是(不是)一个好主意,因为…原因。。。下面是一些关于您为什么应该(不应该)这样做的示例:…示例。。。同时,阅读这篇…论文,文章,帖子,链接到一项研究。。。这证明了我的观点


让我们试着分析所提出的算法,就好像“无损后处理”是一个秘密函数一样,从一些可能的函数空间中提取

在这个视图中,后处理有点像一个密钥,而整个算法是一个带密钥的散列(如HMAC)。下面是关于这个算法的一些关键点

键控散列可以抵抗已知的明文攻击:如果攻击者知道许多后处理散列的输入值,则仍然很难找到“键”。但是,如果后处理很简单,如示例中的strev,攻击者很容易找到“密钥”

您必须仔细设计这些功能的空间


编辑:对散列结果应用分组密码怎么样?至少通过这种方式,你可以充分利用经过仔细检查的非破坏性函数空间的优势。

你应该始终假设算法是已知的,因为你知道,这样做的目的是什么,而不是重新灰化或使用加密解决方案?你是否在努力提高绩效,你这样做是否出于理论原因,你是否在调查违规行为?这个问题的背后是什么?迭代,迭代,迭代……你说的“非破坏性”是什么意思?你说的是“可逆性”吗?如果你能从数学上证明你的操作不会改变找到给定散列的消息的概率,也不会增加冲突概率,那么它可能不会造成伤害。然而,从另一方面来说,你也没有得到任何东西(克霍夫原理,见上文)。另一方面,对操作的数学证明是强制性的,并且大多数情况下是相当复杂、容易出错和耗时的操作。