将敏感信息安全地发送到 RESTful 服务

Posted

技术标签:

【中文标题】将敏感信息安全地发送到 RESTful 服务【英文标题】:Securely Sending Sensitive Information to RESTful Service 【发布时间】:2015-10-12 12:04:06 【问题描述】:

所以我搜索并尝试将我找到的各种信息拼凑起来,如果这些信息确实存在于其他地方,我深表歉意。我不是安全专业人士,我想确保我正确执行此操作,以免引入一些疯狂的安全漏洞。

我正在用 C# 开发一个 RESTful 服务,该服务将托管在 Azure 上,允许用户使用用户名和密码登录,然后对该服务的后续调用将与该用户相关联。该服务的第一个客户端将是一个通过 javascript 与服务通信的网络应用程序(不确定这是否会有所不同)。

这就是我想出的工作流程:

用户登陆网站 用户输入用户名和密码 信息发送到服务 这是我知道的细节最少的地方 服务验证用户凭据 服务返回一个供后续服务调用使用的令牌

我已阅读有关 SSL 的信息,并且我知道 Azure 支持 SSL 证书,但我不能 100% 确定这就是我正在寻找的一切。只需拥有 SSL 证书并使用 HTTPS,就可以将纯文本用户信息发送到我的服务吗?这听起来不对。如果没有,我还需要做什么才能安全地将这些(以及可能的其他)敏感信息发送到我的服务?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以查看 Azure 如何为服务总线等实现自己的 REST API。它使用共享访问密钥。客户端不向 REST API 发送用户 ID 和密码,而是形成一个身份验证字符串,并使用共享密钥创建身份验证字符串的哈希,并将该字符串发送到服务器。然后,REST API 身份验证逻辑将形成相同的信息,如果它到达相同的散列,则客户端通过身份验证并将可用于后续调用的令牌发送到客户端。 共享密钥增加了另一层安全性,而不仅仅是通过 https 发送密码。

查看 MSDN 上的服务总线示例代码 Service Bus Brokered Messaging REST Tutorial。特别是“第 3 步:创建管理凭据”描述了此过程。

【讨论】:

【参考方案2】:

如果您的应用程序通过 JavaScript 与托管在 Azure 上的服务通信,您需要查看 ADAL.js。 Vittorio Bertocci 在this article 中准确描述了如何保护这样的应用程序。

使用 SSL/TLS 时,传输通道是加密的,因此任何拦截数据包的人都无法读取明文。您显然仍然需要保护您的应用程序免受其他可能导致信息泄露的攻击(例如 SQL 注入等)。查看OWASP top 10 cheat sheet 了解更多信息。

【讨论】:

我不一定要基于一个客户端 (Javascript) 来实现我的安全性。使用 AD 还可以解决用户身份验证的一个单一问题,尽管这是我目前关注的问题,但并不是全部问题。 ADAL 库也可用于其他类型的客户端。请参阅此处了解概述:msdn.microsoft.com/en-us/library/azure/Dn151135.aspx 哦,太好了。但是广告不只是用于身份吗?我不想让客户填充我的 Azure AD。我假设 Azure AD 用于系统管理员、服务帐户等。 不,您可以在 AAD 中注册用户、组和应用程序。您还可以将用户从本地 Active Directory 同步到 AAD。或者,您可以让 AAD 联合回本地 ADFS 进行身份验证。 这是管理客户帐户凭据的理想、安全的方式吗?

以上是关于将敏感信息安全地发送到 RESTful 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何从 RESTful 服务发送安全令牌?

网络安全学习笔记工具篇——GSIL GITHUB敏感信息泄露检测工具

通过 Spring 进行 RESTful 身份验证

使用 Puppet 处理敏感信息

企业需要通过 PHP 自动通过电子邮件发送安全信息

将用户名 + 加密密码发送到 RESTful 服务