【问题标题】:Send password safely using an ajax request使用 ajax 请求安全地发送密码
【发布时间】:2011-04-29 12:49:25
【问题描述】:

只是想知道,是否可以通过 Ajax 请求安全地发送密码?

我有一个登录框,它调用一个 ajax 请求来尝试登录/传递并检索一个带有错误(如果有的话)的 JSON 对象。

我应该改用表单重定向吗?

[编辑] 将加密密码存储在数据库中不是解决方案,因为 ajax 发送的登录名和密码是访问数据库本身(内部应用程序)的登录名/密码。 p>

【问题讨论】:

    标签: javascript ajax passwords


    【解决方案1】:

    发送第三方无法拦截的内容的唯一方法是使用 HTTPS 而不是常规 HTTP。这样一来,服务器和客户端之间发送的所有内容都会被高度加密。

    【讨论】:

    • 在混合 cordova android 移动应用程序中,使用 https/SSL 传递没有加密密码的 ajax 调用。安全吗???
    【解决方案2】:

    对于它的技术地狱,你可以。如果您可以访问支持crypt(crypt(T,A),B) == crypt(crypt(T,B),A) 的单向加密函数crypt(text,key),您可以执行以下操作:

    • 为您的应用程序准备一个密钥KEY。永远不要告诉任何人。
    • 用户注册时,将crypt(password,KEY)存入数据库。
    • 当用户想登录时,给他们发送一个随机生成的密钥RAND
    • 用户输入密码,表单计算并通过不安全的 AJAX 发送crypt(password,RAND)。密码永远不会离开用户的计算机。
    • 服务器从表单响应中计算crypt(crypt(password,RAND),KEY),从数据库中计算crypt(crypt(password,KEY),RAND),并将两者进行比较。他们应该是平等的。

    所有这些都是不必要的复杂,需要付出很多努力才能正确和安全地实施。 购买 SSL 证书并使用 HTTPS 更容易实现这种安全级别,甚至更多。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      哈希密码并存储在数据库中

      在客户端:哈希密码,然后添加盐(连接 session_id 字符串),然后再次哈希

      在服务器上:从数据库中获取散列 pw,然后添加盐(连接 session_id 字符串),然后再次散列

      [编辑:然后将服务器上生成的hash-salt-hash与客户端发送的hash-salt-hash进行比较]

      现在拦截你的 hash-salt-hash 密码已经没什么用了,因为它只对那个特定的会话有效......

      【讨论】:

        【解决方案4】:

        您正在寻找的是“零知识协议”。这是一种无需发送即可知道密码的沟通方式。您将在用户浏览器中运行的 javascript 和服务器之间进行通信。

        奖励,即使连接未加密,这些协议通常也是安全的。请注意,依赖它而不使用 SSL 是愚蠢的,因为中间的人会简单地用一个只发送密码的相似函数替换你漂亮的零知识协议实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-13
          • 1970-01-01
          • 1970-01-01
          • 2013-11-06
          • 2013-07-07
          • 2010-12-07
          • 1970-01-01
          相关资源
          最近更新 更多