【问题标题】:Password Hashing for SocialNetworking and Finacal data [duplicate]社交网络和财务数据的密码散列 [重复]
【发布时间】:2011-11-30 10:31:18
【问题描述】:

可能重复:
Salting Your Password: Best Practices?

我工作的公司正在建立一个社交网络(就像许多其他人一样)。在使用用户登录系统时,我不确定要使用哪种散列。我知道永远不要使用 md5。我有一种有趣的方式来使用 sha512 和漩涡以及不断变化的盐。我的老板说他可能想让用户财务数据与登录信息相关联。语言是 PHP 只是为了让你知道。

【问题讨论】:

    标签: php hash


    【解决方案1】:

    无论您做什么,都不要使用您自己的密码哈希函数。你能做的最糟糕的事情就是使用加密原语“有一种有趣的工作方式”。像 bcrypt 这样的算法是由专业密码学家开发和分析的,他们比我、你或 StackOverflow 上的任何人都做得更好。

    当您认为自己正在加强安全性时,很容易削弱您的安全性。

    此外,对于财务信息,请不要使用您自己的密码哈希函数。说两遍就够重要了。

    【讨论】:

    • @Carmon Skinner 我不会自己动手,我比那个更了解。我过去曾研究过这些是如何制造的以及它的大量工作。我在说的是我应该如何将盐添加到用户密码中以及使用哪些功能。例如。我可以。 $password.$salt 或者我可以做 $salt.$password$salt 然后散列它。
    • 好的,我很高兴听到这个消息。就盐而言,无论您是添加还是添加它都没有关系,但是两次包含它是没有意义的。阅读 PBKDF2 (tools.ietf.org/html/rfc2898) 了解如何实现良好的哈希函数,或阅读stackoverflow.com/questions/4795385/… 了解如何在 PHP 中使用 bcrypt。
    • 我使用前置和附加或将其分成两半并将其混合到用户密码中的原因如下。让我们假设黑客获取的是用户的数据库表而不是代码。他们不会知道我是如何应用哈希的。所以如果他们试图暴力破解$password.$salt。但我使用了 $salt.$password。他们会在那里浪费时间。他们需要能够正确地使用盐。到那里 burteforce 字符串。如果盐与密码混合在一起,则意味着他们必须从strach中强制执行并且不能使用盐。
    • @WojonsTech,盐应该在密码的开头还是结尾的问题是攻击者必须猜测的1位信息。只需从一个好的随机源中选择足够长的盐,攻击者必须以更简单的方式猜测很多位。
    • @Wyzard 我通常使用的盐。 mt_rand 然后我将其更改为基数 36 数字。我知道黑客必须猜测。但我想确保他们试图破解单个用户会花费他们这么多钱和这么多时间,只是为了弄清楚我注入盐的方法。例如。大多数人前缀或附加盐。攻击者将制作 2 个集群试图找出它是哪一个。但是,如果他们最终意识到它不是帖子或前缀,他们将不得不更多地拆分资源以找到我的方法。对我来说确实需要更多的 CPU,但值得。
    【解决方案2】:
    • 使用良好的哈希函数。
    • 为每个用户使用单独的盐。

    我最近看到Blowfish 被推荐为密码散列的最佳实践,因为它比 SHA 系列慢,因此它使暴力猜测攻击不太实用。根据 Wikipedia 的说法,OpenBSD 之所以使用它就是因为这个原因。

    您还可以考虑实现对OpenID 的支持,这样用户就不必在您的网站上存储密码。 (这对于社交网络来说是一个不错的可选功能,但对于金融网站来说可能是不可接受的,例如出于监管原因。)

    【讨论】:

    • 系统确实为每个用户设置了一个单独的盐,每次登录时都会更改。我还使用 sha512 和 whirlpool 进行哈希处理,所以如果你使用暴力破解,你需要在两个算法上进行勾结。我不做 sha512(whirlpoo(password)) 我做 sha512(password) 然后保存然后做 whirlpool(password) 单独保存。我知道系统会有一些来自其他网站的开放 ID 和社交登录。
    • @Wojons 哈哈!它对单独的哈希有何帮助?
    • @Col.Shrapnel,对其中一个函数的成功原像或蛮力攻击将产生在另一个函数下不匹配的值。那里有一些价值,尽管尚不清楚是否值得额外的存储成本;除了猜测真正的密码之外,即使是一个好的哈希函数也不太可能成功地反转。
    • @Col.Shrapnel,原像很可能不会。有无数个字符串可以散列到任何给定的结果,并且“现实”密码在数学上并不比其他密码更重要。但是,假设攻击者很聪明地在随机垃圾之前尝试真实的密码,蛮力可能会。
    • @Woj 这又是一种虚假的安全感。这些“我注入盐的方式”只不过是儿童游戏,与安全无关。
    【解决方案3】:

    要记住的两个明显的事情,每个人都喜欢忘记:

    1. 密码哈希实际上为站点安全本身添加了nothing。这只是假设您的用户群被盗并在其他地方针对相同用户的假想情况。

    2. 没有具有超随机盐的散列算法可以保护愚蠢的密码,如“joe”、“123”或“password”。甚至更复杂的密码,例如“v5dsa”。

    所以,你要么用强密码要求折磨你的用户,要么就忘记密码散列这样愚蠢的事情。

    或者只是警告他们不要为您的网站使用相同的密码并完成您的任务!

    哈希问题在这个网站上被夸大了。
    一个普通的所谓“PHP 程序员”认为,如果他们不使用“损坏”的 MD5(尽管他们不知道这是什么意思),那么他们是安全的。

    可怜的 OP 就是我所说的一个完美的例子:
    他正在做 2 个不同的哈希并将它们分开存储。认为这将有助于保护他们的网站:)

    这就是问题所在。普通用户认为密码散列与站点安全有关。虽然不是。

    【讨论】:

    • 不!索尼的整个 Playstation Network 密码数据库被盗。这根本不是一个虚构的案例。迭代散列或慢速函数(如 bcrypt)为短密码提供了一定程度的保护,对长密码提供了非常好的保护。你是对的,密码“密码”永远不会安全,但你确实需要使用一个好的密码散列系统来保护那些选择好的密码的用户。
    • 虚构的?几乎不。人们经常确实在多个网站上使用相同的密码。
    • @Cameron 密码哈希对索尼用户没有帮助。他们丢失了信用卡信息。那就是问题所在。您必须保护您的系统并为此聘请优秀的专业人员。不只是撒盐,在虚假的安全感中快乐地做梦。
    • 对索尼系统的黑客攻击是一个被盗的数据库。我不确定索尼是否加密了信用卡号码。但这是游戏机网络的问题,而不是用户密码的散列问题。散列密码也很重要。某人在哈希密码上找到匹配项所需的时间可能从几小时到几天不等,具体取决于您的哈希有多复杂,有时需要几个月的时间。如果每个用户都有不同的盐。那么简单的比较将无法证明 2 个用户在查看哈希值时是否具有相同的密码。哈希和盐有很大帮助。
    • @Col.Shrapnel 我知道散列不适用于整个站点的安全性,我正在使用它来避免强制执行或最终获得用户表副本的人无法登录。
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2013-01-08
    • 2020-08-16
    • 1970-01-01
    • 2011-03-21
    • 2011-05-09
    • 2020-03-09
    相关资源
    最近更新 更多