我需要在配置数据库中存储第三方密码,因此用户可以保存可通过我们的服务器访问的Web服务的登录信息。
我需要将密码传递给Web服务,所以我不能只是哈希密码并存储哈希。我需要能够获得发送到服务的实际密码。
出于安全考虑,我想加密我们存储在数据库中的密码。我查看有关加密密码的所有内容似乎都说“哈希,不加密!”但我不认为这适用于这种情况。
我想知道在VB.NET代码中处理加密/解密或使用SQL Server来完成它是否更好(从我看到here,它至少可能在SQL中做到这一点,但我不确定这是否有意义。我需要研究更多以了解部署问题是什么样的。)
答案 0 :(得分:1)
我同意乔治斯托克。如果您可以使用现有协议 - 请使用它(它将减少可能的问题和安全漏洞的数量十倍)。
就在这种情况下,如果你没有选择(不能使用任何协议)。如果只有当用户在您的服务器上执行某些操作时才需要访问第三方Web服务器,我建议您:
不要在数据库中存储密码
使用第三方服务的密码创建一个cookie,并使用某个密钥进行加密。将此cookie发回给用户。
一旦用户返回您的网站,您将获得cookie,解密,从cookie获取密码并使用它访问第三方Web服务。
因此,在这种情况下,如果有人破解您的服务器并将复制数据库,他们就不会拥有第三方Web服务的密码。在这种情况下,如果有人破解用户计算机,所有cookie都是加密的,因此他们无法对它们做任何事情。
这是唯一的安全漏洞,如果有人能够将一些代码注入您的服务器并从活动用户会话中捕获密码。
答案 1 :(得分:0)
一般来说,散列密码是最好的,但在你的情况下似乎是不可能的。我绝对不建议在SQL服务器本身上使用对称密钥进行加密,原因是如果您的SQL服务器遭到入侵,那么您的加密也会受到损害(因为密钥将在同一台服务器上)。
我建议的一件事是你在某处使用临时商店,这可能就像在会话中一样。但是要小心使用会话和cookie,因为您可能容易受到CSRF攻击和会话/ cookie劫持攻击。您可以做的一件事是让用户输入密码,然后加密并将其存储在他们的cookie中,将他们的客户端IP附加到cookie中,然后在开始时添加一个到期时间戳(这也将使雪崩效果更有效,因为你正在改变明文开头的位数)。要求对Web服务的请求是,它们附加了一些在客户端呈现的CSRF令牌,并且它是POST而不是get,最后验证客户端IP并且时间戳不早于x分钟/小时(取决于你想成为多么偏执)。
如果用户cookie被盗,那么他们将无法发出请求,因为它是特定于他们的客户端IP(除非他们欺骗用户IP但是那时你意识到这个攻击者不是那么聪明,因为我是确定有其他更容易的攻击向量,将给他们更大的有效载荷)。如果用户能够以某种方式欺骗IP,他们将无法长时间使用它,因为超时会使cookie无效。如果用户足够聪明,可以很好地破坏你的加密算法......那么你几乎没有机会。