0

由于破解密码哈希已成为脚本小子的新消遣,我想到了这个问题并想出了一个新颖的(?)想法。

  1. 将通行证存储为偏移量+数字而不是哈希
  2. 这个数字是两个大素数的乘积
  3. 密码转换为数字,添加偏移量,并使用素数来划分数字。如果它除且除数是两个素数中较大的一个,则密码是正确的。

根据定义,每个哈希值都是唯一的,并且每个密码可以根据偏移量以多种不同方式进行哈希处理。打破一个哈希意味着你必须分解数字(这很难),然后找到一个对应于更大prime-offset(这是微不足道的)数字的单词。

要生成使用函数 f() 将密码转换为密码数字(不重要),请生成两个大于 2^4096 的随机素数,或者多少就足够了。取较大的素数并计算素数密码数=偏移量。将素数相乘得到“数字”。存储编号和偏移量。

去检查。使用函数 f() 将密码转换为密码数字,添加偏移量以查找素数。用素数除以得到另一个素数。检查第一个素数是否是两者中较大的一个。如果是这样,密码是正确的。

f() 可能是例如密码的 utf-8 编码,被理解为一个大的二进制整数。

4

3 回答 3

2

您的程序并没有真正比使用散列函数为您带来任何好处。是的,反转您的函数很困难,因为它需要分解大量数字,但是反转常规散列函数也很困难。攻击者仍然可以使用与常规哈希算法相同的程序:通过测试每个可能的密码来进行暴力攻击。

当然,这对于任何存储足够数据来验证密码的方案都是不可避免的。唯一的解决方案是让攻击者这样做的计算成本很高,方法是使哈希函数的计算成本很高,并添加盐以确保它们无法预先计算。

于 2012-06-07T02:53:37.900 回答
0

一般来说,尝试发明自己的加密系统很难做到正确。您必须考虑许多小事情,并且很容易错过攻击可以利用的东西。如果您使用已建立的密码学或散列库,您仍然会过得更好、更安全。用于散列的 Bcrypt 可能比您发布的解决方案更安全。

于 2012-06-06T14:37:35.787 回答
0

要正式确定您的方案:

要创建哈希:

  1. 用户输入密码 pw
  2. 使用编码函数 e 将 pw 转换为字节数组 ba
  3. 将 ba 转换为大整数 bn
  4. 求素数 p 和 q,p > q > max(bn, 2^2048)
  5. 存储 n = pq 和 o = p - bn

要验证哈希:

  1. 用户输入密码 pw
  2. 使用编码函数 e 将 pw 转换为字节数组 ba
  3. 将 ba 转换为大整数 bn
  4. 验证 bn + o 除以 n

这是一个安全的散列要求给定 n 和 o,推断 pw 是不可行的,即没有算法比猜测和检查更有优势。我相信这个。

正如我所看到的,您的方案的主要好处是通过选择随机数将随机性注入到散列过程中。它们是质数并且分解应该是困难的更多的是实现细节(这是您的单向函数)。大概它也应该减慢检查速度,尽管我真的不知道在这么大的数字上除法有多慢。

有趣的是,哈希创建和密码验证过程是如此不同。正如您所指出的,这使得彩虹表哈希链接技术不适用。这可能是一个优势,但每个用户的盐渍化可以为您提供类似的彩虹表保护。

于 2012-06-06T18:12:19.270 回答