【发布时间】:2014-05-30 18:30:53
【问题描述】:
在存储之前对哈希字符串进行某种非破坏性的后处理(重新排序)是个好主意吗?例如:
$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 没有 reduce 算法的密钥空间。
我不寻找的答案:
- 老兄,用盐来避免 raimbow table blah blah - 虽然 Rainbow table 是相关的
- 只需像这样
hash(hash(hash($data)))重新散列您的哈希 - 问题与重新散列无关 - 请不要使用自己的加密货币 - 我说的不是这个
- 不要运行自己的加密货币。 - 这也无济于事
我正在寻找的答案:
这是(不是)一个好主意,因为......原因......这里有一些关于为什么你应该(不应该)这样做的例子:......例子......另外,阅读这个......论文、文章、帖子、研究链接……证明了我的观点。
【问题讨论】:
-
你应该总是假设算法是已知的,因为你知道Kerckhoffs’s principle。
-
这样做而不是重新散列或使用加密解决方案的目的是什么?您是否正在尝试提高性能,您是否出于理论上的原因这样做,您是否正在调查违规行为?这个问题的背后是什么?
-
迭代,迭代,迭代......
-
“非破坏性”是什么意思?你的意思是“可逆”吗?
-
如果您可以在数学上证明您的操作不会改变在给定哈希值的情况下找到消息的概率并且不会增加冲突概率,那么它可能不会受到伤害。但是,另一方面,您也没有获得任何东西(Kerkhoff 原则,见上文)。另一方面,您的操作的数学证明是强制性的,而且大多数时候是相当复杂、容易出错且耗时的操作。