前段时间我正在开发一种加密技术,以了解有关计算机安全性的更多信息。嗯,这是大约8个月前的现在,我有点从未回过头来。那改变了!我正在为我的作品Intranet写一个小的asp.net网站,需要登录系统,所以我想要加密密码并将它们存储在数据库中。
所以,我会告诉你我前一段时间做的笔记和例子,我想知道我是否能得到一些反馈/如果我所做的事基本没有意义/非常不安全(不计算我告诉你如何运作的事实......)
继续前进!
我要做的第一件事是将输入的字符串分解为每个字符值,所以如果用户有密码" Hello"它会被分解如下......
"H" = 104,
"E" = 101,
"L" = 108,
"L" = 108,
"O" = 111
我接下来要做的是生成一个随机数,让我们说50到100之间保持简单,然后我从那个伪随机数中找到第n个素数,所以如果生成的数字是70则会给我349
接下来我要做的就是将转换后的输入字符串中的所有十进制数加起来。
104 + 101 + 108 + 108 + 111 = 532
然后我将给定的数字乘以找到的第n个素数,因此532 * 349
给我185668
。
然后,该数字存储在数据库中,其中包含哈希(或任何你称之为的) - 第n个素数 - 在另一列中。
答案 0 :(得分:4)
这样安全吗?不。这是否保护用户密码?没有。
它很容易受到基本密码分析的影响。例如,通过简单的SQL注入,攻击者可以获得“哈希”和素数。
从那里,攻击者可以简单地将散列除以素数并得到字符的总和。
这里有趣的是,虽然原始密码受到保护,但碰撞却没有。因此,攻击者可以生成一个简单的冲突并使用它来登录您的站点。
例如,假设在划分“hash”之后是532.我们可以通过重复>
个字符(">>>>>>>"
)的7个字符串来获得相同的哈希值。
好的哈希函数有3个基本属性:
h(m)
应该很难找到m
)m
应该很难找到n
,以便h(m) == h(n)
)h(m) == h(n)
。你的给定函数可能只做第一个,但只是因为有太多可能的排列(碰撞),所以不可能分辨原始的是什么......
所以绝对不是。
我建议使用经过批准和审核的加密,然后选择Coursera Cryptography Course。