简单的密码加密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的密码加密相关的知识,希望对你有一定的参考价值。
什么是用于保护数据库中密码的简单加密方案?我不一定需要任何超级安全的东西,也不需要任何快速闪电的东西,但那些东西会很好。首先,我只想要一些易于实现而不会非常缓慢或不安全的东西。
正如mk所说, SHA1或MD5是标准的,还有SHA2 。
更新:随着处理器多年来变得更快,哈希变得更加强大。现在建议你使用bcrypt
。
您想要的更通常称为加密哈希函数。加密哈希被设计为单向(给定结果哈希,您不应该能够导出原始输入)。此外,具有相同散列的两个任意字符串(称为散列冲突)的可能性应该是低的(理想地是1 /散列值的数量)。
不幸的是,仅仅因为你的密码是经过哈希处理的,并不能让你免于努力保持哈希版本的安全。很多人会使用容易受到离线暴力攻击的弱密码。
编辑 - 几个人也已经指出了使用盐的重要性。 salt是一个常量值,在使用哈希函数之前,它与输入混合在一起。拥有独特的盐可防止离线攻击者使用预先计算的常用密码表(彩虹表)来更快地强制您的密码。
您需要使用单向散列算法,如上面提到的SHA-1和salt。我会建议这个网站获取更多信息。它包括一些示例代码/实现。 http://www.obviex.com/samples/hash.aspx
我认为,提高安全性的关键是使用动态盐。这意味着您为每个新用户生成一个随机字符串,并使用该字符串来填充哈希值。当然,您需要将此salt存储在数据库中以便以后能够验证密码(我不以任何方式加密它)。
对于不可逆加密,我绝对会使用SHA256或SHA1。 MD5现在有很多冲突,并且已经付出很多努力来打破它,所以不是一个好用的。
如果您希望面向未来的解决方案,我建议使用SHA256或SHA512。加密geekworld正在让人们对MD5感到紧张,而在较小程度上则是SHA1。
或者,如果可以,请等待SHA-3
我注意到很多关于如何正确进行密码哈希的困惑,特别是在stackoverflow上。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。
更多信息:How to do password hashing properly
如果你使用MD5或SHA1使用盐来避免彩虹表黑客攻击。
在C#中这很容易:
MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );
容易:BCrypt。
杰夫的You're probably storing passwords incorrectly文章是关于这个主题的精彩阅读。
几个星期前,这是我的一个问题。我们正在将一个大型MIS项目部署到975个不同的地理位置,我们自己的用户凭证存储将用作不同已经实现和使用的应用程序集的身份验证器。我们已经提供了基于REST和SOAP的身份验证服务,但客户坚持能够从其他应用程序到达用户凭据存储,只需要一个DB连接即可查看相关表或视图的只读视图。叹息......(这种高度耦合的糟糕设计决定是另一个问题的主题)。
这迫使我们坐下来将我们的盐渍和迭代散列密码存储方案转换为规范,并提供一些不同的语言实现以便于集成。
我们简称为Fairly Secure Hashed Passwords或FSHP。在Python,Ruby,php5中实现它并将其发布到Public Domain。可在http://github.com/bdd/fshp的GitHub上消费,分叉,火焰或吐痰
FSHP是一个盐渍的,迭代哈希的密码哈希实现。
设计原理类似于RFC 2898中的PBKDF1规范(又名:PKCS#5:基于密码的密码规范2.0版).FSHP允许在SHA-1和SHA-2中选择盐长度,迭代次数和底层加密散列函数(256,384,512)。在每个输出的开头自定义元前缀使其可移植,同时让消费者选择自己的密码存储安全基线。
安全:
默认FSHP1使用8字节盐,具有4096次SHA-256散列迭代。 - 8字节盐通过将所需空间乘以2 ^ 64而使彩虹表攻击变得不切实际。 - 4096次迭代导致暴力攻击相当昂贵。 - 在此版本发布时,没有已知的针对SHA-256的攻击以发现具有少于2 ^ 128个操作的计算工作的冲突。
实现:
- Python:使用2.3.5(w / hashlib),2.5.1,2.6.1进行测试
- Ruby:测试1.8.6
- PHP5:使用5.2.6进行测试
每个人都非常欢迎创建缺少语言的实现或改进当前的实现。
基本操作(使用Python):
>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True
自定义CRYPT:
让我们削弱我们的密码哈希方案。 - 将盐长度从默认值8减少到2. - 将迭代轮次从默认值4096减少到10. - 选择FSHP0,使用SHA-1作为基础哈希算法。
>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==
使用SHA单向散列算法和唯一的盐。它是我用于在数据库中存储密码的主要算法。
如果您使用的是SQL Server,那么就有HashBytes函数:
http://msdn.microsoft.com/en-us/library/ms174415.aspx
我用二次投票给MD5或SHA投票。任何主要的Web开发语言都具有内置的用于计算哈希的函数(例如,在PHP中,mcrypt包包含必要的函数)。
以上是关于简单的密码加密的主要内容,如果未能解决你的问题,请参考以下文章
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段