我认识的一家公司正在讨论加强其所有 Web 应用程序产品的密码安全策略。

现在,他们正在通过 HTTP 以 POST 形式发送用户名/密码身份验证,因此,它们是以明文形式发送的。

解决该问题的最简单方法就是要求在所有应用程序中使用 HTTPS 登录,对吗?

好吧,有一些内部讨论关于改为进行某种我们自己的客户端密码加密(密码+盐等)。

是否有公认的纯 HTTP 解决方案?

意见就像...好吧,每个人都有自己的意见,所以我正在寻找可以支持您的建议的可靠的安全文献。不要只是用谷歌搜索然后给我发一篇博客文章......我已经做到了这一点,而且还做得更多。

我找到了 OWASP 的建议:http://www.owasp.org/index.php/Top_10_2007-A7#Protection

以及微软的:http://msdn.microsoft.com/en-us/library/aa302420.aspx

编辑: 仅仅提供使用 SSL 的建议是不够​​的。我需要某种支持文档。我知道滚动我们自己的客户端加密是不好的。我需要能够可靠地将其推销给同事和管理层。

另外,还提到了 HTTP 摘要。看起来不错,但 Digest 仅用于 HTTP 身份验证,不适用于通过 POST 发送的数据。

有帮助吗?

解决方案

+1 至 迈赫达德的回答. 。继续采用本土加密技术是有风险的。

在看到本土客户端加密解决方案中的漏洞之后,从这里的经验来看。大多数漏洞都是由于相同的原因造成的——数据传输受到密钥加密的保护,但密钥本身是以不安全的方式交换的。

TLS/SSL 不仅解决了安全密钥交换的问题,还解决了安全数据传输的问题。

建立 TLS/SSL 会话后,TLS/SSL 通过使用非对称密钥加密技术来回交换用于加密信息的对称密钥来保护您的敏感信息。对称密钥是在运行时生成的,是客户端和服务器之间的共享秘密;一旦会话准备好传输数据,该密钥就用于加密所有其他流量。

服务器的公钥和私钥仅用于交换此共享秘密。破坏共享密钥的唯一已知方法是破坏服务器的私钥(以便可以解密密钥)。事实上,这需要服务器管理员的疏忽或恶意。

如果您推出自己的加密解决方案,则必须以安全的方式交换对称密钥。 最简单的方法是使用 TLS/SSL;更困难的方法是实现您自己的非对称密钥交换加密解决方案。

其他提示

我强烈的建议不要与自己的解决方案(在安全敏感的环境中)去。去使用SSL。这是一个成熟的技术,很容易实现的。

滚动你自己的安全解决方案可真危险,即使它是正确执行(0.000001%几率),它的是昂贵的。

如果数据本身不太敏感,但密码太敏感,我建议使用 HTTP摘要认证 (这与 HTTP 基本身份验证完全不同)。它通过直接的 HTTP 非常安全,并且在服务器上实现起来一点也不困难。通过网络发送的任何内容都不会泄露密码,只是允许客户端向服务器证明他们拥有正确的密码。

如果您想要了解如何在应用程序中实现 HTTP 摘要身份验证, 保罗·詹姆斯有一篇关于它的优秀文章.

HTTP 身份验证的唯一真正问题在于浏览器本身:用户界面很糟糕,但这还可以 用一些Javascript克服.

您可以通过存储 A1 哈希来安全地存储密码。

更新: 正如其他答案中提到的,虽然服务器可以通过不接受基本身份验证来避免 MITM 攻击,但客户端仍然容易受到攻击,因为它会这样做。

更新: 您无法通过 POST 保护数据,除非 (a) 在客户端上使用 JavaScript 进行加密,或者 (b) 通过 SSL 进行所有操作。

, ,使用一点点魔法,将 HTTP 身份验证与表单一起使用。毕竟,我上面链接的文章名为“使用 HTML 表单进行 HTTP 身份验证”。但这不会通过 POST 完成。

如果你 真的 需要它时,请使用 POST、使用 SSL 并对数据库中的密码加盐。

如果你想避免 CSRF,我建议使用 表单键, ,虽然这个想法有很多不同的名字,但几年前我从黑客 Slashcode 中得到了这个名字供我自己使用,这是我第一次遇到它的地方。

您会花更多的时间和金钱滚滚自己的解决方案,并不能保证它的安全。行业标准的SSL是容易实现,更加安全了比你能负担得起,使自己的解决方案的开箱。

时间==钱

购买证书,并把时间花在你的应用程序的工作安全登录形式代替。

客户端加密对于大多数 MITM 攻击无能为力。攻击者可以简单地删除您的脚本。

它只能防止被动嗅探。如果这对您来说足够好,您可以使用:

  • 在 Javascript 中实现的哈希。实现初始登录的质询响应很容易,但不要忘记,对于攻击者来说,会话​​ cookie 几乎与密码一样好(您必须将登录限制为单个 IP 和/或使用脚本为攻击者生成一次性 cookie)每个请求,我认为这将是困难且脆弱的解决方案)。
  • HTTP 摘要式身份验证。更安全,因为它可以使用一次性哈希、相互身份验证等,但标准 UI 绝对是令人排斥的。

...只需使用 SSL。

HTTP唯一的解决办法将总是容易受到中间人的中间人攻击。

修改::一种网络跟踪将是一种简单的方法来证明HTTP并不安全

好了,这里就是你需要的唯一的答案:你的银行只能通过SSL支持登录/ AUTH。如果有更好的方式来做到这一点,他们会。

好吧,有一些内部讨论,有关进行某种滚动客户端密码的加密(密码 +盐等)。

我们需要解决的第一件事是传输中的数据与非传输中的数据。静态数据。从OP看来,最大的问题似乎是互联网上明文的用户名/密码。所以,您确实关心传输中的数据。通过 SSL 的 HTTPS 是一种经过测试的方法(而且这是一个非常简单的修复方法!)。现在,如果您确实想为静态数据(在数据库中、文件服务器上等)滚动自己的数据,那是一个不同的野兽,但现有的数据加密方法将比滚动您自己的更好。

依靠客户端来保证安全是不好的。时期。是的,在企业环境中,您可以在某种程度上依赖标准设置。但是,最终,用户是愚蠢的,您可能会遇到有人禁用 javascript 或您推出的任何基于客户端的解决方案,因此他们最终会以纯文本形式发送用户名/密码(即使您的服务器不知道如何处理它)因为它不是预期的格式。

Roll-your-own 不会像现有解决方案那样受到严格审查。由于代码的原因,您最终可能会添加额外的安全问题。

我们刚刚推出一个网页/移动应用做一些这方面的东西。它为登录创建随机网址,使用HTTPS和用于数据库存储的散列/ AES加密方法。那里有一个简单的JSON API来使用它,而我们的UI,继承人我们的书面记录,给它一看..的 http://blog.primestudiosllc.com/security/send-time-limited-secure-logins-with-timebomb-it

你提到做自己的加密再加盐

...我建议使用 JavaScript的MD5 (它也使用了雅虎在其非SSL页面,还是让他声称)...

和您双击哈希密码......有些人可能会争辩说,双重散列会使其容易发生碰撞攻击。我会不同意,因为人们只对文件,其中大量的数据是md5'ed之所以能做到现在为止MD5签名的碰撞......

如果这是一个大公司的网站(和会有理由打破)没有使用SSL的借口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top