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

有帮助吗?

解决方案

正如MK所说, SHA1 或 MD5 是标准的,还有 SHA2.


更新:这些年来,随着处理器变得越来越快,哈希值也变得更加暴力。现在建议您使用 bcrypt.


您想要的是更普遍的称为加密哈希函数。加密哈希被设计为单向的(给定生成的哈希,您不应该能够导出原始输入)。此外,两个任意字符串具有相同散列(称为散列冲突)的可能性应该很低(理想情况下为 1/散列值的数量)。

不幸的是,仅仅因为您的密码经过哈希处理,您并不需要非常努力地保证哈希版本的安全。太多人会使用容易受到离线暴力攻击的弱密码。

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

其他提示

MD5 或者 SHA1 + 盐。

如果您使用 MD5 或 SHA1,请使用盐来避免彩虹表黑客攻击。

在 C# 中这很简单:

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

简单的: BCrypt.

杰夫的 您可能错误地存储了密码 文章是关于这个主题的优秀读物。

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

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

我们称之为相当安全的散列密码或 FSHP 简而言之。用 Python、Ruby、PHP5 实现它并将其发布到公共领域。可在 GitHub 上使用、分叉、燃烧或吐出: http://github.com/bdd/fshp

FSHP 是一种加盐、迭代散列的密码散列实现。

设计原理类似 PBKDF1 RFC 2898 中的规范(又名: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(带 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

定制地穴:

让我们削弱我们的密码散列方案。- 将盐长度从默认的 8 减少到 2。- 将迭代轮数从默认的 4096 减少到 10。- 选择使用 SHA-1 的 FSHP0 作为底层哈希算法。

>>> 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 包包含必要的函数)。

您需要使用单向哈希算法,例如上面建议的 SHA-1 和盐。我建议您访问这个网站以获取更多信息。它包括一些示例代码/实现。http://www.obviex.com/samples/hash.aspx

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

对于不可逆加密,我肯定会选择 SHA256 或 SHA1。MD5现在有相当多的碰撞,并且已经投入了大量的精力来破解它,所以不是一个很好的使用。

如果您想让您的解决方案面向未来,我建议使用 SHA256 或 SHA512。加密极客世界对 MD5 和 SHA1(程度稍轻)感到不安。

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

我注意到对于如何正确进行密码哈希处理存在很多困惑,尤其是在 stackoverflow 上。所以我写了一个页面来清除所有内容。它比使用简单的哈希要多一些。

更多信息: 如何正确进行密码散列

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top