如果在登录屏幕用户提交他的用户名和密码的形式,密码以纯文本形式发送(即使是POST,纠正我,如果我错了)。
所以,问题是什么,是为了保护用户和他的对抗第三人谁可能对通信数据被窃听密码的正确方法?
据我所知,HTTPS是asolution的问题,但有什么办法,以确保至少有一些安全级别使用标准的HTTP协议(POST请求)? (也许是使用JavaScript以某种方式)
编辑我可能已经离开了一些重要的事情。
我大约是一个网页 - 这是PHP产生的登录页面,这当然是在HTTP GET请求为HTML文件发送给用户。 有服务器和客户端之间建立,所以我不能创建这样的握手协议没有(@Jeremy鲍威尔)连接。 我希望整个过程是透明的用户 - 他要提交密码,不与加密处理。
谢谢。
使用带有SSL的HTTP会让你的生活变得更轻松,你可以放心很聪明的人休息(比我聪明,至少!)已经审查保密通信的这种方法多年。
安全认证是一个广泛的话题。 概括地说,作为@杰里米 - 鲍威尔提到,总是偏向于HTTPS而不是HTTP发送凭据。 它会带走大量的与安全相关的头痛。
TSL / SSL证书是相当便宜这些天。 事实上,如果你不想在所有有免费的letsencrypt.org花钱-自动化的证书颁发机构。
你可以走一步,并使用caddyserver.com在后台调用letsencrypt。
现在,一旦我们得到了HTTPS的方式进行...
你不应该通过POST有效载荷发送登录名和密码或GET参数。 使用授权报头(基本接入认证方案)代替,其被构造如下:
- 用户名和密码被组合成由冒号分开,例如字符串:用户名:密码
- 将得到的字符串使用的Base64的RFC2045-MIME变体编码,除了不限于76字符/线。
- 授权方式和空间,即“基本设置”,然后编码字符串前放。
源: 百科:授权报头
这似乎有点复杂,但事实并非如此。 有很多很好的图书馆,在那里,将提供此功能,您开箱。
有几个很好的理由你应该使用Authorization头
- 它是一个标准
- 这是简单的(你学会以后如何使用它们)
- 它可以让你在URL级别的登录,就像这样:
https://user:password@your.domain.com/login
器(Chrome,例如会自动将其转换成Authorization
头)
重要:
正如@zaph在低于他的评论,发送敏感信息如GET查询指出的是不是因为这将最有可能在服务器日志结束了不错的主意。
您可以使用质询响应方案。 说的客户端和服务器都知道一个秘密S.然后服务器可以肯定的是,客户端知道密码(不给它远离)通过:
- 服务器发送一个随机数,R,到客户端。
- 客户端发送H(R,S)回服务器(这里H是一个加密的散列函数,如SHA-256)
- 服务器计算H(R,S),并将其与客户端的响应。 如果它们匹配,则服务器知道客户知道密码。
编辑:
这里有与R的新鲜度,事实上,HTTP是无状态的问题。 这可以通过服务器创建一个新的秘密,叫。问来处理, 只有服务器知道 。 然后,该协议是这样的:
- 服务器生成的随机数R.然后,它发送到客户端H(R,Q)(其不能被客户端伪造的)。
- 客户端发送R,H(R,Q),并计算H(R,S)和发送所有的回给服务器(这里H是一个加密的散列函数,如SHA-256)
- 服务器计算H(R,S),并将其与客户端的响应。 然后,它以R和计算(再次)H(R,Q)。 如果客户端的的H(R,Q)和H(R,S)版本匹配服务器的重新计算,服务器身份验证认为客户端。
要注意,由于H(R,Q)不能由客户端被伪造,H(R,Q)作为一个cookie(和因此可以作为cookie实际实现)。
另一个编辑:
以前编辑的协议是不正确的谁也观察到H(R,Q)似乎能够用正确的哈希重播任何人。 服务器必须记住其中R的不再是新鲜的。 我CW'ing这个答案这样你们可以编辑掉这一点,并制定出好东西。
如果你的虚拟主机提供商允许的话,或者你需要处理敏感数据,然后使用HTTPS,期。 (它通常由法律要求据我所知)。
否则,如果你想要做的事通过HTTP。 我会做这样的事情。
- 服务器嵌入自己的公钥到登录页面。
- 客户端填充登录表单,并点击提交。
- 一个Ajax请求从服务器获取当前时间戳。
- 客户端脚本串接的凭据,时间戳和盐(从模拟数据,例如。鼠标移动,按键事件散列),使用公开密钥进行加密。
- 提交结果散列。
- 服务器解密哈希
- 检查时间戳足够近(允许短5-10仅次于窗口)。 拒绝登录如果时间戳太旧。
- 存储20秒的哈希值。 拒绝这一间隔期间用于登录的相同的散列。
- 认证用户。
所以这样的口令保护和相同的认证散列不能重播。
关于会话令牌的安全性。 这是一个有点困难。 但它可能使重用被盗会话令牌有点困难。
- 该服务器将包含一个随机字符串额外的会话cookie。
- 浏览器发回的下一个请求此cookie。
- 该服务器检查cookie中的值,如果它是不同的,那么它破坏了会议,否则一切是好的。
- 服务器用不同的文字再次设置cookie。
因此,如果会话令牌被偷了,并且请求他人发送了起来,然后在原始用户的下一个请求的会话将被销毁。 因此,如果用户主动浏览该网站,点击链接的时候,那么小偷会不远处偷来的令牌去。 该方案可以通过要求对敏感操作的另一个身份验证(如帐户删除)被强化。
编辑:请注意,这并不妨碍MITM攻击,如果攻击者建立自己的页面,不同的公钥和代理请求到服务器。 为了防止这种公共密钥必须在浏览器的本地存储或在该应用内固定检测到这些类型的招数。
关于实现:RSA可能是最知名的算法,但它的长密钥相当缓慢。 我不知道如何快速的PHP或Javascript实现会。 但可能有一个更快的算法。
我会用一个服务器端和客户端的Diffie-Hellman密钥交换系统,AJAX或多个表单提交(我推荐前者),虽然我看不到任何好的实现其在互联网上。 请记住,JS库总是可以损坏或MITM改变。 本地存储可用于帮助解决这个问题,在一定程度上。
您可以使用SRP在不安全的通道使用安全密码。 其优点是,即使攻击者嗅探交通,或危及服务器,他们无法使用密码在不同的服务器上。 https://github.com/alax/jsrp是支持通过HTTP安全的密码在浏览器中,或者服务器端(经由节点)一个JavaScript库。
HTTPS是如此强大,因为它使用非对称加密。 这种类型的加密技术不仅可以让你创建一个加密的隧道,但你可以验证你说话的权利人,而不是黑客。
这里是使用非对称密码RSA(由PGP使用)进行通信的Java源代码: http://www.hushmail.com/services/downloads/
您可以使用SSL为你的主机有免费项目SSL像letsencrypt https://letsencrypt.org/