假设一个不太受信任的服务器用于存储用户的机密数据(在客户端加密),并且两个任务 - 身份验证和加密/解密 - 都应该使用单个密码来完成。是否足以:
- 用缓慢的密钥推导功能和普通的盐来加强密码
[1],让步k; - 用作SRP
k“密码”,与服务器进行身份验证并接收密文; - 解密密文以获得用于签名、加密等的实际密钥。
恶意服务器(低风险)必须对验证者或密文执行离线字典攻击才能检索k,而外部攻击者(风险较高)只能进行在线攻击(因为他既无权访问验证者也不是密文),除非他获得数据库的副本——这只会使他处于服务器的类似情况[2]。
这个推理正确吗?有什么我没有预料到的缺陷吗?一些注意事项:
- 我说盐是“微不足道的”,因为它要么是:a)空的;b) 源自用户名;c) 随机,但服务器会将其提供给任何请求它的人。通常这是一个问题,但这里的密钥永远不会离开客户端机器,所以两个用户是否拥有相同的密钥并不重要。
我担心的一个问题是,攻击者可以创建一个针对特定用户的彩虹表,然后获取数据库并几乎立即以该用户身份登录,因为如果你有一个候选列表,强制验证者或密文会更快密钥而不是候选密码列表(在成为密钥之前仍然需要拉伸)。
当然,如果攻击者具有这种计算能力(如果密码很弱),任何泄露的密文最终都会被破解,但如果服务器在这种情况下更强大,则可以避免未来的伤害(在了解 SRP 之前,我设计了一个更复杂的协议考虑到了这一点,但更加浪费并且有未解决的问题)。
- [对于我的特殊情况]所有这些都超出了问题的范围(假设已经弄清楚):所有通信都将通过 TLS 进行,将提供使用正确密钥和 2 因素身份验证的选项(但不是强制性的),客户端代码不会来自不太受信任的服务器,将使用 MAC,等等。