让我们以聊天系统为例,任何用户都可以在其中创建带有密码保护的频道。因此,其他用户只能使用频道密码加入。
因此,通道内的每个人都知道该密码。
这个密码应该在数据库中散列吗?这意味着应用程序无法显示密码(例如,如果一个用户忘记了密码)。
就个人而言,我看不出为什么要对密码进行哈希处理,因为在设置密码时,其他人需要知道它是绝对清楚的。
让我们以聊天系统为例,任何用户都可以在其中创建带有密码保护的频道。因此,其他用户只能使用频道密码加入。
因此,通道内的每个人都知道该密码。
这个密码应该在数据库中散列吗?这意味着应用程序无法显示密码(例如,如果一个用户忘记了密码)。
就个人而言,我看不出为什么要对密码进行哈希处理,因为在设置密码时,其他人需要知道它是绝对清楚的。
就个人而言,我看不出为什么要对密码进行哈希处理,因为在设置密码时,其他人需要知道它是绝对清楚的。
那为什么还要麻烦存储密码,让任何人进入!;)
如果您要存储一个秘密,那是因为这个秘密标识了您的总用户的一个子集。并非所有潜在用户都知道。现在,您可能已经被告知密码必须经过散列和加盐存储。这是您正在处理的密码。我会让你得出合乎逻辑的结论。
也许同一组使用它来访问偶尔包含敏感信息的 SharePoint。也许他们将它用于他们的小组日历,以显示他们的办公室何时是空的或何时他们离家出差。也许创建帐户的人不知道她使用了对她的个人资产有价值的密码。也许他们只是无法处理他们必须处理的大量凭据,仅此一项就解释了重用。
不要成为因过失而对他人造成伤害的人。散列它们(使用慢速密码散列算法)。给它们加盐(每个密码都有一个唯一的盐)。
这取决于您的情况,最好对您的密码进行哈希处理,以防止您的数据库或您的客户网络受到威胁,从而允许攻击者访问他/她设法获得的任何密码。
散列密码的优点:
散列密码的缺点:
因此,假设您通过 MITM 攻击找到了我的哈希密码: $2a$10$VcSYK/yD0T.vXencRFWv6O.8PZtsTMG7ZxZXNRSMXKu9.JTD5RNCS 尝试找到密码?谁知道这可能是我 StackOverflow 帐户的密码。;)
我的观点是使用散列更加安全,因为攻击者还有很多事情要做。在散列之前,您必须暴力破解或使用彩虹表来获取原始值。
共享密码对于管理对私人通信渠道的访问来说是一种糟糕的设计。例如,你不能在不关闭频道的情况下踢出用户:你不能让他们忘记密码。您无法阻止用户与其他用户共享密码(自愿或非自愿)——如果用户的密码被泄露,您可以使其无效,但如果共享密码被泄露,则会给使用该密码的每个人带来不便。
更好的设计将身份验证与授权分开。首先验证用户,例如通过提示他们输入密码(“你声称你是 Bob?证明它!”)。用户通过身份验证后,通过在数据库中查找来确定用户可以访问哪些频道(“让我们看看 Bob 是否应该可以访问疯狂的左手循环频道。”)。
这种关注点分离有很多优点,但它确实有一个你可能关心也可能不关心的结果:实现它的简单方法依赖于中央权威来确定谁可以访问通道。共享密码方法消除了这种中央权限,但代价是具有相当不灵活的访问控制策略(任何用户都可以允许任何其他用户加入,并且只有完全一致才能将用户拒之门外)。
如果频道真的需要密码保护,因为奇怪的访问控制策略是你真正想要的,那么你需要回答两个问题:
如果 (1) 的答案是有人必须知道密码才能提供密码,那么有人必须以可恢复的形式存储密码,因此密码提供者无法使用散列法。如果 (2) 的答案是用户将密码存储在某个密码管理器中,那么在身份验证服务器上对密码进行哈希处理只能提供少量保护,但这仍然是一个好主意。
下一个问题:如果在服务器上可以恢复密码,问题有多大?密码散列仅解决一个特定威胁:如果对手获得对数据库的只读访问权限。如果这允许攻击者恢复密码,那么:
对于共享密码,(2)不适用,只有(1)。因此,与用户帐户的密码相比,这没什么大不了的。以散列形式存储密码是有好处的,但不是决定性的。
长话短说,共享密码不是一个好的模型。如果您坚持使用它,那么很有可能无论如何您都必须以可恢复的形式存储密码,这不是您最大的问题。如果可以,请对密码进行哈希处理,但如果不能,请不要为此失眠。
请注意,如果用户可以创建自己的受保护频道,则不应允许他们选择密码。根据我的经验,这些共享密码总是难以输入,但易于暴力破解,例如CraZyStraWs!!!1. 自动生成一个合理的随机密码(比如统一随机选择的 10 个小写字母)并强制用户使用它。
但是,真的,不要使用共享密码。使用用户/频道访问数据库。
你的逻辑不合理。
“密码不需要散列,因为很多人都需要密码。”
您陈述的第二部分是真实的,并且您已经决定这表明第一陈述应该是真实的。它们实际上是无关的。需要密码的人是否应该从您的服务器获取密码?感觉他们应该从其他用户那里得到它。
这是我将如何处理它:
“应该对密码进行哈希处理,因为服务器永远不会要求将密码提供给用户。”
或者
“密码不应该被散列,因为服务器需要向用户提供密码,并且有一些控制可以防止未经授权访问数据库中的密码。”