我正在设计一个供公司内部使用的小型应用程序。我的应用程序需要代表我的应用程序用户连接到第三方网站。我想将第三方站点的用户凭据安全地存储在数据库中。显然,将第三方密码存储为纯文本是不可能的。
我的建议是:
当用户在中创建帐户时在我的应用程序中,该应用程序会生成两个盐值。
用户输入我的网站的新密码以及第三方网站的凭据(用户名和密码)。
我的应用程序使用第一个盐值和PBKDF2或bcrypt散列用户的本地密码。此哈希保存在数据库中,以供以后进行身份验证。
我的应用程序使用第二个盐值和相同的密钥派生函数来生成第二个哈希。第二个散列用于对第三方凭证进行AES加密。加密的凭据将保存在数据库中,以便对第三方站点进行身份验证。
我能找到的唯一弱点是,如果用户的本地密码比第三方密码弱,则攻击者需要只能猜测本地密码,并且两者都会被破坏。
算法是否还有其他问题?有没有更好的方法来达到相同的结果?
#1 楼
我在IT Security Stack Exchange网站上写了很多有关如何解决此问题的文章。让我为您指出我在那的答案:安全地保留清晰密码的最佳方法是什么?
我如何创建自动登录到第三方的服务?派对服务而不以纯文本形式存储凭据?
应如何存储需要以纯文本形式获取的密码?
基本上,我建议您设置一台单独的计算机来存储用户的密码第三方网站的凭据以及其本地密码的哈希值,对用户进行身份验证,然后直接连接到第三方网站。分开的机器应尽可能小心地固定和锁定,以减少损坏机器的可能性。但是,请阅读这些链接以获取各种广泛的详细信息和建议。
#2 楼
那实际上不是一种算法,更多的是一种方案。基本上没有什么错,但是要确定一个哈希值与另一个哈希值在计算上应该是不可行的,因为每个哈希值对保护同样重要。除了使用不同的哈希算法外,我还将使用其他哈希算法
您也不能存储auth哈希,而是等待成功解密第三方凭据作为身份验证的一种形式。这将减少服务器工作量的一半,或者允许您增加密钥派生工作量。解密后。
评论
$ \ begingroup $
将私有数据的解密用作身份验证机制很有意义。谢谢。
$ \ endgroup $
–拉尔夫
16年3月3日,12:16
评论
在2019年研究主题时->贯穿本文:Deliciousbrains.com/php-encryption-methods