Kor*_*tak 111 security encryption passwords http plaintext
如果在登录屏幕上用户使用其用户名和密码提交表单,则密码将以纯文本形式发送(即使使用POST,如果我错了也请更正).
那么问题是,保护用户及其密码的正确方法是针对可能正在窃听通信数据的第三方?
我知道HTTPS是问题的解决方案,但有没有办法确保使用标准HTTP协议(POST请求)至少某种程度的安全性?(也许以某种方式使用javascript)
编辑 我可能遗漏了一些重要的事情.
我的目的是一个页面 - 这是PHP生成的登录页面,当然,它作为HTML文件在HTTP GET请求中发送给用户.服务器和客户端之间没有建立(@Jeremy Powel)连接,所以我无法创建这样的握手协议.我希望整个过程对用户透明 - 他想提交密码,而不是处理加密.
谢谢.
Jer*_*ell 63
使用HTTP和SSL将使您的生活更轻松,您可以放心,非常聪明的人(至少比我聪明!)多年来仔细检查了这种保密通信方法.
Ful*_*ger 30
安全认证是一个广泛的主题.简而言之,正如@ jeremy-powell所提到的,总是倾向于通过HTTPS而不是HTTP发送凭据.它会消除许多与安全相关的麻烦.
如今,TSL/SSL证书相当便宜.事实上,如果你根本不想花钱,那就有免费的letsencrypt.org - 自动证书管理局.
你可以走一步,并使用caddyserver.com在后台调用letsencrypt.
现在,一旦我们将HTTPS取消了......
您不应通过POST有效负载或GET参数发送登录名和密码.请改用Authorization标头(基本访问认证方案),其构造如下:
- 用户名和密码组合成一个以冒号分隔的字符串,例如:username:password
- 结果字符串使用Base64的RFC2045-MIME变体进行编码,但不限于76个字符/行.
- 然后将授权方法和空格即"基本"放在编码的字符串之前.
来源:维基百科:授权标题
它可能看起来有点复杂,但事实并非如此.有很多好的库可以为您提供开箱即用的功能.
您应该使用Authorization标头有几个很好的理由
https://user:password@your.domain.com/login例如,Chrome会自动将其转换为Authorization标题)重要提示:
正如@zaph在下面的评论中指出的那样,将敏感信息作为GET查询发送并不是一个好主意,因为它最有可能最终出现在服务器日志中.

Jer*_*ell 14
您可以使用质询响应方案.假设客户端和服务器都知道秘密S.然后服务器可以确定客户端知道密码(不给它):
编辑:
这里存在一个问题,即R的新鲜度和HTTP无状态这一事实.这可以通过让服务器创建一个秘密,称之为Q,只有服务器知道来处理.然后协议如下:
需要注意的是,由于H(R,Q)不能由客户端伪造,因此H(R,Q)充当cookie(因此可以实际上作为cookie实现).
另一个编辑:
之前对协议的编辑是不正确的,因为任何观察过H(R,Q)的人似乎都能够用正确的哈希重放它.服务器必须记住哪些R不再新鲜.我正在回答这个问题,所以你们可以编辑这个并找出一些好的东西.
Cal*_*ius 11
如果您的webhost允许,或者您需要处理敏感数据,请使用HTTPS,period.(法律经常要求afaik).
否则,如果你想通过HTTP做一些事情.我会做这样的事情.
因此,密码受到保护,无法重播相同的身份验证哈希.
关于会话令牌的安全性.那有点难了.但是有可能重新使用被盗的会话令牌.
因此,如果会话令牌被盗,并且其他人发送了请求,那么在原始用户的下一个请求中,会话将被销毁.因此,如果用户主动浏览网站,经常点击链接,那么小偷就不会对被盗令牌走得太远.可以通过对敏感操作(例如帐户删除)进行另一次认证来强化该方案.
编辑:请注意,如果攻击者使用不同的公钥设置自己的页面并代理对服务器的请求,则这不会阻止MITM攻击.为防止出现这种情况,必须将公钥固定在浏览器的本地存储中或应用程序内以检测这些技巧.
关于实现:RSA可能是最常见的算法,但对于长密钥来说它很慢.我不知道PHP或Javascript实现的速度有多快.但可能有更快的算法.
您可以使用SRP通过不安全的通道使用安全密码。优点是,即使攻击者嗅探流量或破坏服务器,他们也无法在其他服务器上使用密码。https://github.com/alax/jsrp是一个 javascript 库,支持在浏览器或服务器端(通过节点)通过 HTTP 安全密码。
| 归档时间: |
|
| 查看次数: |
114183 次 |
| 最近记录: |