我正在开发一个必须具有身份验证(用户名和密码)的项目
它还连接到数据库,所以我想我会在那里存储用户名和密码.但是,将密码仅仅放在数据库中的表中的文本字段似乎不是一个好主意.
我正在使用C#并连接到2008 Express服务器.任何人都可以(尽可能多的例子)建议存储此类数据的最佳方法是什么?
PS我很乐意这样的想法,如果可以提供一个很好的理由,这些信息不会存储在数据库中
当我想建立一个登录系统时,我总是将给定密码的MD5与服务器端用户表中的值进行比较.
然而,我的一个朋友告诉我,一个"清晰"的密码可能会被网络软件嗅到.
所以我的问题是:在客户端散列密码是个好主意吗?它比在服务器端散列更好吗?
在工作中,我们有两种相互竞争的盐理论.我工作的产品使用类似用户名或电话号码来加密哈希值.基本上每个用户都有不同的东西,但我们可以随时使用.另一个产品为每个用户随机生成一个salt,并在每次用户更改密码时更改.然后在数据库中加密盐.
My question is if the second approach is really necessary? I can understand from a purely theoretical perspective that it is more secure than the first approach, but what about from a practicality point of view. Right now to authenticate a user, the salt must be unencrypted and applied to the login information.
在考虑之后,我只是没有从这种方法中看到真正的安全性收益.将盐从帐户更改为帐户,即使攻击者知道如何快速确定每个帐户的内容,仍然会使某人尝试强制执行散列算法变得非常困难.这是基于密码足够强的假设.(显然,找到一组密码的正确哈希值,它们都是两位数,比找到8位密码的正确哈希值要容易得多).我的逻辑是不正确的,还是我缺少的东西?
编辑:好的,所以这就是为什么我认为加密盐真的没有意义.(lemme知道我是否在正确的轨道上).
对于以下说明,我们假设密码总是8个字符,盐是5,所有密码都由小写字母组成(它只是使数学更容易).
Having a different salt for each entry means that I can't use the same rainbow table (actually technically I could if I …
更新:请注意我不是在询问盐是什么,彩虹表是什么,字典攻击是什么,或盐的目的是什么.我在查询:如果你知道用户的salt和hash,那么计算密码是不是很容易?
我理解这个过程,并在我的一些项目中自己实现它.
s = random salt
storedPassword = sha1(password + s)
Run Code Online (Sandbox Code Playgroud)
在您存储的数据库中:
username | hashed_password | salt
Run Code Online (Sandbox Code Playgroud)
我所看到的盐析的每次实施都会在密码的末尾添加盐,或者开始:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
Run Code Online (Sandbox Code Playgroud)
因此,来自黑客的字典攻击是值得他的盐(哈哈),只需针对上面列出的常见组合中存储的盐运行每个关键字.
当然,上述实现只是为黑客增加了另一个步骤,而没有真正解决潜在的问题?有什么替代方法可以解决这个问题,还是我误解了这个问题?
我唯一能想到的就是有一个秘密混合算法,它以随机模式将salt和密码绑定在一起,或者将其他用户字段添加到散列过程中,这意味着黑客必须能够访问数据库和代码才能获得花边他们为字典攻击证明富有成效.(更新,正如评论中指出的那样,最好假设黑客可以访问您的所有信息,因此这可能不是最好的).
让我举一个例子,说明我如何建议黑客用密码和哈希列表来破解用户数据库:
来自我们黑客数据库的数据:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
Run Code Online (Sandbox Code Playgroud)
通用密码字典:
Common Password
--------------
letmein
12345
...
Run Code Online (Sandbox Code Playgroud)
对于每个用户记录,循环公共密码并对其进行哈希:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password …Run Code Online (Sandbox Code Playgroud) 据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
我正在阅读一些关于盐和密码哈希的文章,还有一些人提到彩虹攻击.什么是彩虹攻击以及防止它的最佳方法是什么?
可能重复:
PHP密码的安全散列和盐
警告不要将MD5用于密码,请使用像bcrypt这样的替代方法
对于我的密码,我应该使用这样的盐(盐对每个用户都是唯一的,而不是直接用密码存储)...
$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);
Run Code Online (Sandbox Code Playgroud)
或者如果我刚才使用它会没关系:
$password = md5($password);
Run Code Online (Sandbox Code Playgroud)
因为如果我使用盐,即使用户填写密码这样的密码也不重要,因为盐(在这种情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975如此密码的条目将145ac26ff093c6e1317f7d5fb4c9fd11c77be975password根据http://howsecureismypassword.net/它需要3亿十亿年到破解....所以意见?或者我应该更糟糕的去吧
$password = md5($salt.$password.md5($salt));
Run Code Online (Sandbox Code Playgroud)
如果这个人已经走得足够远以获得盐哈希,那么任何东西都可以停下来再进一步吗?<更多声明此最后一个密码
对于那些说每个用户都应该这样做的人......我知道,这只是一个例子.
有人可以帮我理解腌制的效果如何?
到目前为止,我理解以下内容:
我们如何存储盐,或者在用户登录时知道它是什么?我们将它存放在自己的领域吗?如果我们不这样做,应用程序如何确定盐是什么?如果我们存储它,它不会打败整个目的吗?
好的,我想了解使用盐的原因.
当用户注册时,我为他/她生成一个我存储在DB中的唯一盐.然后我用SHA1散列它和密码.当他/她登录时我会重新哈希sha1($salt.$password).
但如果有人攻击我的数据库,他可以看到哈希密码和盐.
是否更难破解而不仅仅是用盐哈希密码?我不明白......
对不起,如果我是傻瓜......
我现在一直在阅读Stack Overflow问题大约15分钟,而且每一个问题似乎都与我之前阅读过的问题相矛盾.Bcrypt,SHA1,MD5等.我目前MD5我的密码,但我想让我的数据库更安全,以防万一.
我知道这已被问了一百万次,但我似乎无法在其他任何地方找到合适的答案.
谢谢.
hash ×4
passwords ×4
salt ×4
security ×4
encryption ×3
php ×2
saltedhash ×2
brute-force ×1
client-side ×1
cryptography ×1
database ×1
mysql ×1
open-source ×1
rainbowtable ×1