Cryptography 保护散列密码的想法

Cryptography 保护散列密码的想法,cryptography,passwords,Cryptography,Passwords,由于破解密码散列已经成为ScriptKiddy的一个新的通行时间,我想到了这个问题并提出了一个新的想法 将过程存储为偏移量+数字,而不是散列 这个数是两个大素数的乘积 密码被转换成一个数字,然后加上偏移量,然后用该素数除以该数字。如果它被除数,除数是两个素数中较大的一个,则密码是正确的 根据定义,每个散列都是唯一的,每个密码可以根据偏移量以多种不同的方式散列。打破一个散列意味着您必须对数字进行因子运算(这很难),然后找到一个对应于较大素数偏移量(这很小)的数字的单词 要生成密码,请使用函数f()

由于破解密码散列已经成为ScriptKiddy的一个新的通行时间,我想到了这个问题并提出了一个新的想法

  • 将过程存储为偏移量+数字,而不是散列
  • 这个数是两个大素数的乘积
  • 密码被转换成一个数字,然后加上偏移量,然后用该素数除以该数字。如果它被除数,除数是两个素数中较大的一个,则密码是正确的 根据定义,每个散列都是唯一的,每个密码可以根据偏移量以多种不同的方式散列。打破一个散列意味着您必须对数字进行因子运算(这很难),然后找到一个对应于较大素数偏移量(这很小)的数字的单词

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

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


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

    一般来说,试图发明自己的密码系统是非常困难的。有很多小事情你必须考虑,很容易错过一个攻击可以利用的东西。如果您使用一个已建立的加密或哈希库,您的情况会更好、更安全。Bcrypt for Hash可能比您发布的解决方案更安全。

    要正式确定您的方案:

    要创建哈希,请执行以下操作:

  • 用户输入密码pw
  • 使用编码函数e将pw转换为字节数组ba
  • 将ba转换为大整数bn
  • 求素数p和q,p>q>max(bn,2^2048)
  • 存储n=pq和o=p-bn
  • 要验证哈希,请执行以下操作:

  • 用户输入密码pw
  • 使用编码函数e将pw转换为字节数组ba
  • 将ba转换为大整数bn
  • 验证bn+o除以n
  • 这是一个安全散列,要求给定n和o,推导pw是不可行的,即没有比猜测和检查更有利的算法。我相信

    在我看来,您的方案的主要好处是通过选择随机数将随机性注入哈希过程。它们是素数,分解应该很困难,这更多是一个实现细节(这是您的单向函数)。大概它也会减慢检查速度,尽管我真的不知道在这么大的数字上除法有多慢


    有趣的是,散列创建和密码验证过程如此不同。正如您所指出的,这使得rainbow表哈希链接技术不适用。这可能是一个优势,但每个用户的satting可以从rainbow表中获得类似的保护。

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


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

    您将得到更好的答案。如果我在这里什么都没有得到,我会把这篇文章贴在这里。这篇文章遗漏了很多细节。你能编写生成和验证散列的伪代码吗?@MarkusMikkolainen一个建议:不要像论坛帖子那样使用评论。与问题相关的信息应放在问题本身中编辑它。Stackoverflow的工作原理与论坛不同。我真的不明白它应该如何工作。我同意,这应该发布在crypto上,如果可能的话,使用协议的数学描述。伪代码在stackoverflow上更有用。是的,我知道这一点,并且我使用了已知的哈希技术。今天早上在火车站等火车时,我突然想到了这一点,我不明白为什么它不起作用。这一切都很好,但请把它视为一种学习经验。这可能不是最好的方案——如果它真的有效的话(没有更好的定义就说不出来)。一个优点是密码没有上限。在普通散列中,一旦为128位散列收集了128位的熵,就会出现冲突。在这种情况下,您可以使用更长的密码,并在需要时增加素数的位大小。另一个优点(我认为)是,这不能用rainbow表来表示,所以蛮力就是蛮力。我认为它对rainbow表的恢复力并不比使用等效(4096位)salt的SHA256强。唯一的区别是熵是内置在您的设计中的,因此不是可选的。彩虹表的想法是您可以链接哈希。你怎么把这些链起来的?是的,很有趣。我需要进一步考虑并更新我的答案。是的,对于简单的密码来说,这就像哈希一样容易被破解,但我认为你实际上无法破解这个密码。此外,它基本上支持密码中的任何长度,不会发生冲突。本质上,您可以通过在密码中添加一个随机前缀而不存储它来增加难度,然后自己进行试除法。这将添加一个常数做功因子。不,不能使用彩虹表,因为这相当于盐渍哈希,也不能使用彩虹表。和