【问题标题】:Simple password encryption简单的密码加密
【发布时间】:2010-09-07 01:17:12
【问题描述】:

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

【问题讨论】:

    标签: database language-agnostic passwords


    【解决方案1】:

    MD5SHA1 + 盐。

    【讨论】:

      【解决方案2】:

      使用SHA 单向哈希算法和唯一的盐。这是我在数据库中存储密码的主要算法。

      【讨论】:

        【解决方案3】:

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

        在 C# 中这很简单:

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

        【讨论】:

          【解决方案4】:

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

          http://msdn.microsoft.com/en-us/library/ms174415.aspx

          【讨论】:

            【解决方案5】:

            Jeff 的 You're probably storing passwords incorrectly 文章非常适合阅读此主题。

            【讨论】:

              【解决方案6】:

              我支持 MD5 或 SHA 的投票。任何主要的 Web 开发语言都具有用于计算哈希的内置函数(例如,在 PHP 中,mcrypt 包包含必要的函数)。

              【讨论】:

              • 为什么人们会随机四处投反对票?
              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                正如 mk 所说,SHA1 或 MD5 是标准的,以及 SHA2


                更新:多年来,随着处理器的速度越来越快,哈希变得更加暴力。现在建议您使用bcrypt


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

                不幸的是,仅仅因为您的密码经过哈希处理并不能让您免于努力确保哈希版本的安全。太多人会使用容易受到离线暴力攻击的弱密码。

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

                【讨论】:

                • 对于 OP:当使用 MD5 或 SHA1/2 等单向哈希时,您无法“解密”它。也就是说,您将无法从哈希字符串中恢复原始明文密码。要在用户登录时测试密码,请将相同的哈希应用于输入的密码并比较两个哈希。
                【解决方案9】:

                简单:BCrypt

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

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

                    我们将其称为“相当安全的哈希密码”或简称为 FSHP。 在 Python、Ruby、PHP5 中实现它并将其发布到公共领域。可在 GitHub 上http://github.com/bdd/fshphttp://github.com/bdd/fshp 上消费、分叉、燃烧或吐痰

                    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(带 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
                    

                    自定义密码:

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

                    >>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
                    >>> print fsh
                    {FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==
                    

                    【讨论】:

                      【解决方案12】:

                      对于不可逆加密,我绝对会使用 SHA256 或 SHA1。 MD5现在碰撞比较多,破解也费了不少功夫,所以不好用。

                      【讨论】:

                        【解决方案13】:

                        如果您想让您的解决方案经得起未来考验,我建议您使用 SHA256 或 SHA512。 Cryptographic geekworld 对 MD5 感到不安,对 SHA1 的担忧程度略低。

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

                        【讨论】:

                          【解决方案14】:

                          我注意到很多关于如何正确进行密码散列的困惑,尤其是在 stackoverflow 上。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。

                          更多信息:How to do password hashing properly

                          【讨论】:

                          • 您能否编辑一下您的答案以详细说明一下?这几乎感觉像是您页面的无耻插件(spam)。您的页面似乎包含一些有用的信息。
                          猜你喜欢
                          • 1970-01-01
                          • 2020-01-31
                          • 2015-05-27
                          • 2013-11-14
                          • 1970-01-01
                          • 2015-06-29
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多