只是要知道,是否可以安全地通过Ajax请求发送密码?
我有一个登录框,调用ajax请求尝试登录/传递并检索有错误的JSON对象(如果有的话)。
我应该使用表单重定向吗?
[编辑] 将加密密码存储在数据库中不是解决方案,因为ajax发送的登录名和密码是访问数据库本身的登录名/密码(内部应用程序)。
答案 0 :(得分:13)
发送无法被第三方拦截的内容的唯一方法是使用HTTPS而不是常规HTTP。这样,服务器和客户端之间发送的所有内容都是高度加密的。
答案 1 :(得分:12)
对于它的技术地狱,你可以。如果您可以访问支持crypt(text,key)
的单向加密函数crypt(crypt(T,A),B) == crypt(crypt(T,B),A)
,则可以执行以下操作:
KEY
设置一个密钥。别告诉任何人。 crypt(password,KEY)
存储在数据库中。RAND
crypt(password,RAND)
。密码永远不会离开用户的计算机。crypt(crypt(password,RAND),KEY)
计算crypt(crypt(password,KEY),RAND)
,并比较两者。它们应该是平等的。所有这些都是不必要的复杂,需要花费很多精力才能正确安全地实施。 购买SSL证书并使用HTTPS更容易实现此级别的安全性,甚至更多。
答案 2 :(得分:1)
以下是您可以做的事情:
哈希密码并存储在数据库中
在客户端:哈希密码,然后添加salt(连接session_id字符串),然后再次哈希
在服务器上:从数据库中取出散列的pw,然后添加salt(连接session_id字符串),然后再次散列
[编辑:然后将服务器上生成的hash-salt-hash与客户端发送的hash-salt-hash进行比较]
现在拦截你的hash-salt-hash密码是没用的,因为它只对那个特定的会话有效...
答案 3 :(得分:0)
您正在寻找的是“零知识协议”。这是一种沟通的方式,你知道密码而不发送它。您将在用户浏览器中运行的javascript与服务器之间进行通信。
奖励,即使连接未加密,这些协议通常也是安全的。请注意,依赖于此并且不使用SSL将是愚蠢的,因为中间的人只需用一个只发送密码的外观相似的函数来替换你的零知识协议实现。