我不确定标题是否准确,如果合适,请随时重命名。
我正在考虑将敏感数据存储在远程服务器上的服务。为了获得最大的隐私,数据将在客户端上加密(使用AES),加密密钥不会存储在任何地方,因此,如果服务器受到损害,敏感数据仍然相对安全。
现在的问题是,我需要第二个密码才能访问该服务,但第二个密码必须存储在服务器的某个地方。
当用户注册时会发生这种情况:
然后:
这看起来不错,但缺点是用户需要两个不同的密码。这是不切实际的,并且还存在用户为两者选择相同字符串的风险,从而大大降低了模型的有效性。
我想要的是使用两个独立的密码,但只询问用户一个。
我的第一个想法是询问用户密码,然后将其拆分为两个并使用第一部分作为服务凭证(密码A),而第二部分则是加密密钥(密码B)。
这具有降低密码强度的缺点:如果用户提供的字符串已经弱/短,则密码A和密码B甚至会更弱。
另一种选择:使用用户提供的密码作为加密密钥(密码B),并使用该密码的哈希值(SHA-256)作为服务凭证。
注册:
然后:
这意味着
这是否会显着降低系统的安全性?即当攻击者获得对服务器的访问权限时,在知道哈希(哈希(加密密钥))时更容易解密敏感数据吗?
是否有另一种(更好的)方法从单个字符串开始获取两个独立密码?
答案 0 :(得分:2)
我会采用不同的方法。使用openid对您的系统进行身份验证。这样,您根本不必将密码传输到服务器。
在第一种方法中,您应该只传输哈希值。
答案 1 :(得分:1)
如果我没记错的话,LastPass会使用这个系统:
我可能会向后使用哪个哈希值,但听起来你想要的东西非常相似。如果您有兴趣,可以在Security Now #256中详细解释整个事情。
答案 2 :(得分:1)
正如@Tim在他的回答中所建议的那样 - 不要创建新的用户身份验证方案(您自己的用户ID和密码组合)。
根据您正在构建的内容,您基本上有两个选项:
请注意,您的应用不必须是基于网络才能使用它们。 (但你确实需要上网)。有关详细信息,请参阅this question
对于加密密钥,使用某种Key Derivation Function(也称为PRF+
)进行密钥派生 - 最好还使用其他组件。喂PRF / KDF,例如以下(连接):
Francescos secureapp keypad
)这有点类似于IKEv2 protocol
中的AUTH有效负载计算这样潜在的攻击者就需要从各个位置访问信息,以便能够解密用户的敏感数据。
另外,请勿在服务器端存储用户的加密密码。客户端应始终向用户询问(或缓存它一定时间)并在发送加密通道时将其发送到服务器(每当请求需要的内容时)。 DE] cryption。
此外,如果您要对加密密码强制执行某种密码策略,请参阅此comic和this answer以获取有关如何完成此操作的参考。
答案 3 :(得分:1)
使用安全密码方案的建议是正确的。您可能想要做的是在将用户的文本传递给密码方案之前进行一些小的更改。如果用户输入“password”,则将“passwordLOCAL”传递给本地密码方案,将“passwordREMOTE”传递给远程密码方案。
这允许用户输入单个密码,但仍然有两个不同的本地和远程密码。实际上不要使用“LOCAL”和“REMOTE”,这太不安全了。使用两种不同的随机字符串,就像两种不同的盐一样。
答案 4 :(得分:0)
您可以在服务器上生成并存储IV(或两个,如果需要),并将其发送到客户端到HMAC。这将生成所需的加密密钥。