在数据库中存储密码的首选方法/数据类型是什么(最好是SQL Server 2005).我在几个应用程序中一直使用的方法是首先使用.NET加密库,然后将它们作为二进制文件存储在数据库中(16).这是首选方法还是我应该使用不同的数据类型或分配比16更多的空间?
我需要在.Net WinForms应用程序中存储单个密码的哈希值.
什么是最安全的方法?
特别是:
我假设算法应该是SHA512或HMACSHA512.
我使用.NET System.Security.Cryptography类散列密码.它有一些散列算法,例如MD5,SHA1,SHA256,SHA384,SHA512
结果散列值是一个字节数组.我应该将它转换为十六进制字符串进行存储,或Convert.ToBase64String(),还是其他东西?(我喜欢Base64,因为它比Hex短).
顺便提一下,有很多哈希算法可供选择,我随机选择了SHA384,但有哪一个"更好"或适合这项任务?
请评论.
阅读前八条评论后更新:
通过答案和我已经完成的进一步阅读,似乎MD5,SHA1或多或少相当(SHA1稍微更安全).SHA256,384,512在递增顺序时提供更好的安全性.
由于我不需要fort-knox(这是一个没有网址,浏览器,互联网,内联网或外联网的内部企业系统),我将绕过"腌制"业务 - 我想如果有人可以窃取密码表,他们也可以窃取其他表中的实际数据.
但我将保留"盐"概念以供将来参考; 不确定在散列之前是否应该在密码附加(最后)或预先(在前面)附加盐,它会产生影响吗?此外我还在考虑使用密码本身的前几个字符作为盐,以避免额外的字段来存储它,但我想它不够长 - 并且盐应该足够长.
共识认为base64转换是存储和比较的合理选择.鉴于最大密码长度为15个字符,我仍然需要弄清楚哈希存储需要的最大数据库列长度是多少.也许Varchar(64)?
谢谢大家的贡献.
我在SO上看到了 一些 问题和答案,表明MD5不像SHA这样安全.
我的问题是,这在我的情况下值得担心吗?
这是我如何使用它的一个例子:
MD5(message+time+password).在这个例子中,我真的更喜欢使用SHA而不是MD5吗?
在什么情况下,散列函数的选择在实际意义上真的很重要?
编辑:
只是为了澄清一下 - 在我的例子中,移植到SHA算法有什么好处吗?
换句话说,在这个例子中,有人在不知道共享密码的情况下发送消息和正确的哈希是否可行?
更多编辑:
为重复编辑道歉 - 我不清楚我在问什么.
我正在做一些研究或谷歌搜索处理密码散列和盐析的不同方法,并遇到了这个有趣的链接:
现在,基本上建议的是创建两个用户函数,一个用于散列,另一个用于检查散列.
盐是伪随机的,但实际上是基于密码(让我感觉不好?).
散列函数也伪随机地"散布"哈希字符串中的盐.
哈希检查功能反转盐洒,然后进行实际的哈希检查.
现在,我知道每个密码哈希的唯一salt =好,但是具有散列密码并创建存储在db函数中的salt的逻辑可能=坏.
我喜欢盐不明显的想法,它也不需要基于一些有希望的一致性值,如用户名,用户ID,出生日期等,但正如我所说,我确实对实现有疑问.
那么,人们对"最佳方法解决方案"的看法和想法是什么?
我们有许多网络服务和网络应用程序以不同方式对用户进行身份验证,其中一些具有不同的密码要求,原因非常糟糕.例如,一个系统拒绝$签名,直到有人"修复"某些Perl脚本中的字符串处理.另一个系统似乎解析@密码中的标志.另一个系统向用户发出密码,开发人员很自豪地告诉我这是用户名的可逆转换.
我知道密码哈希是首选; 但我想知道在向基于浏览器的软件过渡中必须牺牲多少.对于我自己的启发,并提出改变的案例,是否有关于密码处理和管理主题的权威参考,我可以在我的部门和那些负责其他服务的人员中展示?
我正在阅读有关如何安全地存储密码的相互矛盾的建议.我所知道的不是使用MD5!我见过人们主张使用PHP的bcrypt功能,这看起来好像它会占用服务器的处理器.我见过盐的倡导者,并主张不使用盐.
这一切都是如此不清楚.关于如何安全地存储密码,是否有真实可信的建议?
编辑:经过大量研究后,我发现了一篇文章;登录:深入讨论该主题:http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf
hash ×7
passwords ×6
security ×5
encryption ×3
md5 ×2
salt ×2
.net ×1
base64 ×1
cryptography ×1
database ×1
digest ×1
mysql ×1
php ×1
sha ×1
sql-server ×1