Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在数据库中安全地存储第三方Web服务的密码?_.net_Sql_Encryption_Passwords - Fatal编程技术网

.net 如何在数据库中安全地存储第三方Web服务的密码?

.net 如何在数据库中安全地存储第三方Web服务的密码?,.net,sql,encryption,passwords,.net,Sql,Encryption,Passwords,我需要在我们的配置数据库中存储一个第三方密码,以便用户可以保存他们的登录信息,以便通过我们的服务器访问web服务 我需要将密码传递给web服务,所以我不能只对密码进行散列并存储散列。我需要能够获得发送到服务的实际密码 出于安全原因,我想加密存储在数据库中的密码。我查到的关于加密密码的所有信息似乎都在说“散列,不要加密!”但我认为这不适用于这种情况 我想知道,在VB.NET代码中处理加密/解密还是使用SQL Server来完成它更好(据我所见,至少可以在SQL中进行加密/解密,但我不确定这是否有意

我需要在我们的配置数据库中存储一个第三方密码,以便用户可以保存他们的登录信息,以便通过我们的服务器访问web服务

我需要将密码传递给web服务,所以我不能只对密码进行散列并存储散列。我需要能够获得发送到服务的实际密码

出于安全原因,我想加密存储在数据库中的密码。我查到的关于加密密码的所有信息似乎都在说“散列,不要加密!”但我认为这不适用于这种情况


我想知道,在VB.NET代码中处理加密/解密还是使用SQL Server来完成它更好(据我所见,至少可以在SQL中进行加密/解密,但我不确定这是否有意义。我需要进一步研究,以了解部署问题会是什么样子)。

我同意George Stocker的观点。如果您可以使用现有的协议,那么就使用它(它将把可能出现的问题和安全漏洞减少十倍)

在这种情况下,如果您没有选择(不能使用任何协议)。如果仅当用户在您的服务器上执行某些操作时才需要访问第三方Web服务器,我建议您执行以下操作:

  • 不要在数据库中存储密码

  • 创建一个带有第三方服务密码的cookie,并使用一些密钥进行加密。将此cookie发送回用户

  • 一旦用户返回您的网站,您将获得cookie,解密cookie,从cookie中获取密码,并使用它访问第三方Web服务

因此,在这种情况下,如果有人入侵您的服务器并复制数据库,他们将没有第三方Web服务的密码。在这种情况下,如果有人入侵用户的计算机,所有的cookie都是加密的,所以他们将无法对它们做任何事情


唯一的安全弱点是,如果有人能够向您的服务器中注入一些代码,并从活动用户会话中捕获密码。

一般来说,最好对正确的密码进行哈希运算,但在您的情况下,这似乎是不可能的。我绝对不建议在SQL server本身上使用对称密钥进行加密,原因是如果您的SQL server受损,那么您的加密也会受损(因为密钥将位于同一台服务器上)

我建议您在某个地方使用临时存储,这可能类似于会话中的存储。但是,使用会话和cookie时要小心,因为您可能容易受到CSRF攻击和会话/cookie劫持攻击。您可以做的一件事是让用户输入密码,然后加密并存储在他们的cookie中,将他们的客户端IP附加到cookie中,然后在开始时添加过期时间戳(这也会使雪崩效应更有效,因为您正在更改明文开头的位)。要求向web服务发出请求,要求他们附加一些在客户端呈现的CSRF令牌,并且该令牌是POST而不是get,最后验证客户端IP,并且时间戳不超过x分钟/小时(取决于您希望的偏执程度)


如果用户cookie被盗,则他们将无法发出请求,因为这是特定于他们的客户端IP的(除非他们欺骗用户IP,但在这一点上,您会意识到该攻击者并没有那么聪明,因为我确信还有其他更容易的攻击向量会给他们更大的负载)。如果用户能够以某种方式欺骗IP,他们将无法长时间使用它,因为超时将使cookie无效。如果用户足够聪明,能够很好地破解你的加密算法。。。那么你一开始就几乎没有机会了。

请更详细地描述为什么你不能散列你的密码。将其传递给web服务的要求如何改变任何事情?您是对的-哈希不是解决此问题的方法。不确定你在寻找什么样的“最佳实践”-因此这个术语太宽泛和模糊了。@justinskilles-更详细吗?密码需要是可恢复的,这意味着散列是不存在的。OP描述足以确定这一点。您是否同时拥有这两项服务?如果是这样,您可以使用OAuth并存储令牌,而不是用户凭据。web服务是否属于另一方?如果是这样,您可以要求他们实现OAuth端点。它减少了您的责任,也减少了他们的责任。您可能还想了解Mint的工作,只需说您的要求涉及很多内容,不这样做或使用OAuth几乎比使用OAuth要好: