【问题标题】:creating a simple one-way hash创建一个简单的单向哈希
【发布时间】:2013-05-19 10:41:48
【问题描述】:

是否有任何标准哈希函数/方法可以将任意 9 位整数映射到另一个(唯一的)9 位整数,因此映射回来有些困难(不使用蛮力)。

哈希不应发生冲突,因此每个输出 1 ≤ y < 10^9 都需要从 1 ≤ x < 10^9 中的一个且只有一个输入值映射。

【问题讨论】:

  • 如果您有 1 GB 的存储空间可供使用,您可以通过对 1-10^9 的有序数字进行 fischer yates shuffle 来创建一次性便笺簿。不完全符合您的要求,但我认为您极不可能找到具有您正在寻找的功能的散列函数。

标签: javascript hash cryptography hashmap


【解决方案1】:

您描述的问题确实是格式保留加密旨在解决的问题。

一个标准是 NIST 的 currently being worked out:块密码的新 FFX 加密模式。

但它可能比您预期的要复杂。我在 Javascript 中找不到任何实现,但其他语言中存在一些示例:here (Python) 或 here (C++)。

【讨论】:

    【解决方案2】:

    您需要一个只有大约 30 位的非冲突哈希函数。对于任何散列函数来说,这都是一项艰巨的任务。实际上,你需要的不是一个像哈希这样的伪随机函数,而是一个伪随机排列。

    您可以为此使用加密功能,但显然您需要对密钥保密。此外,加密功能通常以位作为输入和输出,10^9 不太可能使用确切数量的位。因此,如果您要选择这样的选项,您可能必须使用格式保留加密。

    您还可以使用组 0..10^9-1 中的任何其他 PRP 函数(在将值递减 1 之后),但如果攻击者发现您使用的参数,那么它变得非常简单恢复到原来的状态。一个例子是与一个与 10^9-1 互质的数相乘,以 10^9-1 为模。

    【讨论】:

      【解决方案3】:

      This 是我能想到的:

      var used = {};
      
      var hash = function (num) {
          num = md5(num);
          if (used[num] !== undefined) {
              return used[num];
          } else {
              var newNum;
              do {
                  newNum = Math.floor(Math.random() * 1000000000) + 1;
              } while (contains(newNum))
              used[num] = newNum;
              return newNum;
          }
      };
      
      var contains = function (num) {
          for (var i in used) {
              if (used[i] === num) {
                  return true;
              }
          }
          return false;
      };
      
      var md5 = function (num) {
          //method that return an md5 (or any other) hash
      };
      

      但是我应该注意,当您尝试散列许多不同的数字时会遇到问题,因为do..while 会产生随机数并将它们与已经生成的数字进行比较。如果您已经生成了很多数字,那么您将越来越不可能找到剩余的数字。

      【讨论】:

      • 不知何故,如果您使用上述代码,我认为这不是您将遇到的唯一麻烦。如果您输入相同的数字,您如何确定生成相同的哈希值?
      • 是的,你是对的。当我想到它时,这并不是 OP 真正想要的。它只会在同一个会话中生成相同的哈希,但如果你重新加载页面,它会生成新的、不同的哈希。
      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2012-03-09
      • 2017-12-01
      • 2012-02-14
      相关资源
      最近更新 更多