假设我正在设计一个具有适度安全要求的 Web 服务。在大多数情况下,威胁模型更多的是关于无聊的大学生,而不是你在间谍小说中找到的任何东西。使用以下密码存储方案实际上会有什么问题吗?
盐 || 哈希(网站 || 密码 || 盐)
其中site是我的站点的唯一标识符,password是用户密码,salt是用户特定的随机salt,hash是通用的加密散列函数,如SHA-1,|| 表示串联。
我知道这个计划带来的某些问题。
哈希(设计为)可以快速评估,并且一次迭代会使特定的弱密码变得可猜测。
单独的连接可能会导致哈希的整体输入中出现“双关语”。
现在,Internet 上的某些安全专家会让我相信,如果这是我对一个足够好的密码散列方案的想法,我不可能配得上工作,并且迫切需要重返学校。他们指出,从安全角度来看,有一些众所周知的密码散列方案具有更好的特性。他们要求我改用更好的东西。
但真的,我应该吗?我在这里有一点反驳的论点。
这可能不会是我服务中最薄弱的环节。真正决心闯入的人还有很多其他途径,我应该优先安排时间来保护较弱的途径。
如果我的网站没有什么内在价值,那么成本效益已经对攻击者不利。大型集群/僵尸网络可以在一天/一周内恢复弱密码,这有多大实际问题?那天/那一周肯定有更有价值的事情要做。
由于特洛伊木马、键盘记录程序、社会工程攻击等,更有可能发生被盗帐户。技术并不是这种安全性的限制因素。
我的方案越复杂,移动/扩展到另一个平台可能就越困难。如果我使用 bcrypt(假设),我可能必须编写一个 bcrypt 包装器并将其合并。
我真的很喜欢这个方案。这真的很简单。实施很难出错。我会争辩说,就普通网站而言,出于所有意图和目的,它应该没问题。要求我采用更好的散列方案几乎听起来像是要求我在已经很容易受到电锯伤害的门上安装更大的锁。
如果我在这里做错了什么,我将非常感谢有人指出这一点,特别是在实际和现实世界适用的问题方面。
谢谢。