简单密码加密
正如mk所说,SHA1或MD5是标准的,以及SHA2。
你想要什么更一般地称为加密散列函数。加密哈希被设计为单向的(给定哈希结果,你不应该能够得到原始输入)。此外,具有相同散列的两个任意字符串(称为散列冲突)的可能性应该较低(理想情况下为1 /散列值的数量)。
不幸的是,仅仅因为你的密码被散列并不能使你不必为了保证散列版本的安全而努力。太多的人会使用弱密码,而这些密码很容易受到离线暴力攻击的影响。
编辑 - 几个人也已经指出了使用盐的重要性。 salt是一个常量值,在使用散列函数之前,您可以将其与输入混合。拥有独特的盐可以防止脱机攻击者使用预先计算的常用密码表(彩虹表)来更快地强制您的密码。
如果您使用MD5或SHA1使用盐,以避免彩虹表黑客入侵。
在C#中,这是很容易:
MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat("ummm salty ", password);
byte[] hash = hasher.ComputeHash(Encoding.Unicode.GetBytes(addSalt));
我第二次投MD5或SHA与盐。任何主要的Web开发语言都有用于计算哈希的内置函数(例如,在PHP中,mcrypt包中包含必要的函数)。
为什么人们随意去走一走,downvote完全合法的答案? – 2009-08-07 15:28:20
您需要使用上面建议的SHA-1的单向散列算法,使用salt。我会建议这个网站获取更多信息。它包含一些示例代码/实现。 http://www.obviex.com/samples/hash.aspx
我认为更好的安全性的关键是使用动态盐。这意味着您将为每个新用户生成一个随机字符串,并使用该字符串来散列哈希值。当然,你需要将这个salt存储在数据库中,以便稍后能够验证密码(我不会以任何方式加密它)。
这是几周前我夫妇的问题。 我们正在部署一个大型MIS项目到975个不同的地理位置,我们自己的用户凭证存储将用作不同的已经实施和正在使用的应用程序集的认证器。我们已经提供了基于REST和SOAP的身份验证服务,但是客户坚持要能够通过数据库连接到其他应用程序的用户凭据存储区,以相关表或视图的只读视图。唉... (这个高度耦合的糟糕的设计决定是另一个问题的主题)。
这迫使我们坐下来将我们的腌制和迭代散列密码存储方案转换为规范,并提供一些不同的语言实现以实现轻松集成。
我们称之为相当安全的散列密码或简称为FSHP。 在Python,Ruby,PHP5中实现它,并将它发布到公共领域。可用于消费,分叉,燃烧或吐在GitHub上http://github.com/bdd/fshp
FSHP是一种腌制的迭代哈希密码散列实现。
设计原理与在RFC PBKDF1规范类似2898 (又名:PKCS#5:基于密码的加密规范版本2.0) FSHP允许选择盐的长度,迭代次数和 底层加密散列功能在SHA-1和SHA-2(256,384,512)之间。 在每个输出开始时自定义元前缀使它变得便携,同时让消费者选择自己的密码存储安全基准。
SECURITY:
默认FSHP1使用8克字节的盐,与SHA-256哈希的4096次迭代。 - 8字节盐渲染彩虹表攻击是不切实际的,将 所需的空间乘以2^64。 - 4096次迭代会导致蛮力攻击相当昂贵。 - 没有已知的针对SHA-256的攻击,用于在 此发行版中找到与 之间的计算量少于2^128个操作的冲突。
实现:
- 的Python:与2.3.5(W/hashlib),2.5.1测试,2.6.1
- 红宝石:与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==
对于非可逆加密,我绝对会用SHA256或SHA1。 MD5现在有相当多的碰撞,并且已经付出了很多努力来打破它,所以不是一个好用的。
如果您想要面向未来的解决方案,我推荐使用SHA256或SHA512。 Cryptographic geekworld正在对MD5产生不安情绪,SHA1的影响程度稍低。
或者,如果可以的话,等待SHA-3
我注意到有关如何操作密码散列妥善很混乱,尤其是计算器。所以我写了一个应该清除一切的页面。还有一点比使用简单的哈希。
你能编辑你的*答案*来详细说明一下吗?这几乎感觉就像一个无耻的插件(*垃圾*)为您的网页。您的网页似乎包含一些很好的信息。 – jschmier 2011-03-26 20:14:37
对于OP:使用MD5或SHA1/2等单向散列时,不能“解密”它。也就是说,您将无法从哈希字符串中恢复原始密码。要在用户登录时测试密码,请将相同的散列应用于输入的密码并比较两个散列。 – 2009-01-02 17:37:01