Database 简单密码加密

Database 简单密码加密,database,language-agnostic,passwords,Database,Language Agnostic,Passwords,什么是一个好的,简单的加密方案来保护数据库中的密码?我不需要任何超安全的东西,也不需要任何闪电般快速的东西,但这些东西会很好。首先,我想要的是一些易于实现而又不会非常缓慢或不安全的东西。或+salt 使用单向散列算法和唯一的salt。这是我用来在数据库中存储密码的主要算法。如果使用MD5或SHA1,请使用salt以避免彩虹表黑客攻击 在C#中,这很简单: MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider(); strin

什么是一个好的,简单的加密方案来保护数据库中的密码?我不需要任何超安全的东西,也不需要任何闪电般快速的东西,但这些东西会很好。首先,我想要的是一些易于实现而又不会非常缓慢或不安全的东西。

或+salt

使用单向散列算法和唯一的salt。这是我用来在数据库中存储密码的主要算法。

如果使用MD5或SHA1,请使用salt以避免彩虹表黑客攻击

在C#中,这很简单:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

如果您使用的是SQL Server,则有HashBytes函数:


杰夫的文章在这个话题上读得非常好。

我对MD5或SHA投了赞成票。任何一种主要的web开发语言都内置了用于计算散列的函数(例如,在PHP中,mcrypt包包含必要的函数)。

您需要使用单向散列算法,如上面建议的SHA-1和salt。我建议您访问这个网站了解更多信息。它包括一些示例代码/实现。

正如mk所说,SHA1或MD5与SHA2是标准配置


更新:随着处理器在过去几年中速度的提高,散列变得更容易执行。现在建议您使用


您需要的是更一般的加密哈希函数。加密散列被设计为单向的(给定结果散列,您应该无法派生原始输入)。另外,两个任意字符串具有相同哈希(称为哈希冲突)的可能性应该很低(理想情况下为哈希值的1/2)

不幸的是,仅仅因为你的密码是散列的,并不能让你从努力保证散列版本的安全中解脱出来。太多人会使用易受离线暴力攻击的弱密码


编辑-一些人也已经指出了使用盐的重要性。salt是一个常量值,在使用hash函数之前,您可以将其与输入混合在一起。拥有一个独特的salt可以防止离线攻击者使用预先计算的常用密码表(彩虹表)更快地暴力破解您的密码。

简单:。

我认为,提高安全性的关键是使用动态salt。这意味着您为每个新用户生成一个随机字符串,并使用该字符串对哈希进行加密。当然,您需要将此salt存储在数据库中,以便以后能够验证密码(我不以任何方式对其进行加密)。

几周前这是我的问题。 我们在975个不同的地理位置部署了一个大型MIS项目,我们自己的用户凭证存储将用作不同已实现和正在使用的应用程序集的验证器。我们已经提供了REST和基于SOAP的身份验证服务,但客户坚持要能够通过其他应用程序访问用户凭证存储,只需将DB连接到相关表或视图的只读视图。叹息。。。(这种高度耦合的糟糕设计决策是另一个问题的主题)

这迫使我们坐下来,将我们的salt和迭代散列密码存储方案转换为规范,并提供一些不同的语言实现以便于集成

简而言之,我们称之为相当安全的散列密码。 用Python、Ruby、PHP5实现并发布到公共域。可在GitHub上食用、叉取、燃烧或吐出

FSHP是一种经过盐析、迭代散列的密码散列实现

设计原则与RFC 2898中的规范类似 (又称PKCS#5:基于密码的加密规范2.0版。) FSHP允许选择salt长度、迭代次数和 SHA-1和SHA-2之间的底层加密哈希函数(256384512)。 在每个输出开始时自定义元前缀使其可移植,同时让使用者选择自己的密码存储安全基线

安全性

默认的FSHP1使用8字节的SALT,使用4096次SHA-256哈希迭代。 -8字节salt通过乘以 所需空间为2^64。 -4096次迭代导致暴力攻击的成本相当高。 -目前还没有已知的针对SHA-256的攻击来查找与的冲突 计算时少于2^128次运算的计算工作量 这次发布

实施:

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True
  • 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
自定义密码:

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True
让我们削弱我们的密码散列方案。 -将盐的长度从默认值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或SH512。加密geekworld对MD5感到不安,对SHA1的不安程度稍低


或者,如果可以的话,请等待

我注意到关于如何正确进行密码散列的很多困惑,尤其是在stackoverflow上。所以我写了一个页面,应该把所有的事情都弄清楚。这比使用一个简单的散列要复杂得多


更多信息:

对于OP:当使用单向散列(如MD5或SHA1/2)时,您不能“解密”它。也就是说,您将无法从哈希中恢复原始明文密码