我听到人们一遍又一遍地说你不应该实现自己的安全算法,我想问你我是否违反了这条规则。
我正在创建一个带有扭曲的传统客户端-服务器应用程序:我想加密客户端上的所有数据,这样即使是完全控制我的服务器的攻击者也无法访问用户的数据。也就是说,我希望对我的客户端-服务器应用程序进行端到端加密。
客户端使用从用户密码派生的加密密钥加密用户的数据,因此服务器无法找出密码很重要,因为这将允许服务器解密用户的数据。因此,客户端使用安全远程密码协议来避免将密码发送到服务器。到现在为止还挺好。
现在这是我的设计有点不正统的地方。问题是用户通常不擅长创建密码——通常从前 10,000 个密码列表中选择一个密码——这将使有权访问服务器的攻击者很容易解密用户的数据。因此,我计划生成一组随机字符并将它们附加到用户 ID 字段,因此用户需要使用以下凭据登录:
User ID: John-CPE4E38J
Password: snoopy
但在处理这些凭据之前,登录代码会将随机字符移动到密码中,因此底层 SRP 身份验证库会看到:
User ID: John
Password: snoopy-CPE4E38J
此外,客户端提供记住用户 ID(即 John-CPE4E38J),因此大多数时候用户只需要记住他们的密码。
您如何看待这种方法?我是否违反了不实施自己的安全算法规则?或者这是加强我的应用程序安全性的好方法?