所有开发人员面临的一个非常基本的问题:每当用户提交表单时,密码都会通过网络发送,并且必须受到保护。我开发的网站没有HTTPS。所有者既不想购买SSL证书,也不想对自签名证书感兴趣。所以我想在提交表单时使用Javascript保护通过HTTP发送的密码。
渴望下来的人:How to send password securely over HTTP?不提供任何合理的解决方案,我处于另一种情况。
如果我使用MD5,可以反转该密码字符串。那怎么样的nonce / HMAC?任何可用的Javascript库吗?或者你有什么建议/提示要解决?提前谢谢!
答案 0 :(得分:76)
无法在没有SSL的情况下安全地发送用户可以验证的密码。
当然,您可以编写一些JavaScript,通过散列或公钥加密,使密码安全,实现线上传输。但是,用户如何确保JavaScript本身在到达它们之前没有被中间人篡改,将密码发送给攻击者而不是网站,甚至只是破坏了安全性。算法?唯一的方法是让他们成为专家程序员,让他们检查你的页面和脚本的每一行,以确保在输入密码之前它是犹太人。这不是一个现实的情况。
如果您希望密码免受中间人攻击,则必须购买SSL证书。没有其他办法。习惯它。
如果我使用MD5,可以反转该密码字符串。
不......至少不是微不足道的。虽然MD5对它有攻击,但它是一种哈希算法,因此是不可逆转的。你必须蛮力。
但同样,一个中间人攻击者不需要看你的MD5。他可以简单地破坏你发送用户制作MD5的JavaScript。
答案 1 :(得分:24)
这里的解决方案是根本不发送密码。使用挑战/回应。
在原始表单中包含一大块随机文本和一个键。根据服务器上的密钥将原始随机文本存储在会话中。当客户端提交表单时,使用JS将随机文本和密码一起散列。然后将用户名,密钥和散列随机文本发送到服务器。请勿发送密码。在服务器上,使用密钥查找原始随机文本,使用存储的密码执行相同的散列操作。如果服务器散列值与客户端散列值匹配,那么您知道客户端输入了正确的密码而没有将密码发送到服务器。
密码是否正确,密钥和随机文本到期,因此每个密码都是一次性使用。
答案 2 :(得分:11)
如果您真的想深入研究这个问题,请查看创建的Diffie-Hellman key exchange以“允许彼此之前没有相关知识的双方在不安全的通信渠道上共同建立共享密钥” “
我不是加密专家,所以如果攻击者同时拥有客户端(JavaScript源代码)和传输机制(数据包嗅探器),我不完全知道它是否真的安全
答案 3 :(得分:5)
您可以在发送之前使用javascript RSA实施来加密密码。 (以下是RSA In Javascript的示例。)
但我相信这一个并且使用哈希函数将容易受到replay attacks的攻击。所以,要小心。
答案 4 :(得分:4)
遗憾的是,无法确保未加密请求的安全性。任何能够访问您的JavaScript的人都可以简单地对其进行反向工程/篡改它,任何拥有数据包嗅探器的人都可以观看未加密的流量。这两个事实共同意味着:
没有SSL?没有安全保障。
答案 5 :(得分:1)
您拥有的任何传输都将是明确的;也就是说,没有SSL,您的关键信息就会暴露出来。值得与网站所有者讨论这一点。换句话说,最好采取必要的措施来强化数据传输,SSL是您可以采取的基本,廉价步骤之一。
答案 6 :(得分:1)
我认为这里的问题不是技术,而是你如何解释SSL的重要性。为他们提供可靠的阅读材料,我相信网上有很多。
答案 7 :(得分:1)
该解决方案要求客户端能够使用已知 的秘密加密密钥对客户端和服务器加密密码。
SSL通过要求服务器和客户端Web浏览器都拥有自己的非对称公钥/私钥对来实现这一点,他们使用它们来加密并在它们之间传输随机会话密钥。然后,对话的其余部分使用该安全会话密钥。
因此,您正在询问如何解决与SSL相同的问题,而无需使用已知仅到客户端和服务器的密钥。我不是专家,但看起来这样做不可能,或者至少不容易。
答案 8 :(得分:1)
如果您无法访问SSL,则MD5应足以防止意外发现密码(例如在网络日志文件或其他内容中)。别的什么都浪费时间。只需确保该应用程序无法访问敏感信息(即信用卡号,病史等)。
与评论者提出的其他人一样,严重的攻击者将能够破解页面上的任何类型的安全性。 SSL甚至是一个小障碍,因为大多数用户使用易于猜测的密码,在任何地方重复使用相同的密码,将密码提供给任何要求的人,或者可能被欺骗通过复制的页面或“技术”放弃密码支持“电话。
答案 9 :(得分:0)
- 英文 - 我认为有些东西,但我不知道它是否真的安全。如果您可以将表单放在php文件中,那么您可以创建一个algoritm来创建基于时间或其他内容的字符串,然后将此字符串放在您的html中。
当用户在密码输入字段中输入密码时,当您调试密码时,您可以看到用户输入的值,因此在通过post或get发送信息之前,您可以使用密码用户作为提示来加密首先生成加密字符串,然后,只是发送了用户输入的密码。
通过这种方式,攻击者不会拥有js代码中的所有内容,因此他们需要发现您创建的算法来解密它。
这只是一个想法,所以如果你能告诉我这是不安全的,我会很感激。
- 西班牙语 - Se me acaba de ocurrir algo que puede servir,pero no se si realmente sea algo seguro。来自medio de php puedes generar un algoritmo que cree un string en base al timestamp oalgomás,ydespuéscolocaresta cadena en el html。
注意que cuando alguien escribeunacalconseñaenun campo输入tipo密码,con un debug puede ver el valor que tecleo el usuario(no se si exista manera pero no quiseinvestigarmás),asi que podemos utilizarlacontraseñadeque elusuarioescribiócomopalabra clave para encriptar la cadena de texto que previamente habiamos generado con php,por medio de un aligitmo en JS。 Seríaalgoasícomoencriptar lo encriptado。 Posteriormente lo que estariamos enviadonoseríalacontactñaetecada,si noestaúltimacadenaresultante。
Buscando un contra,loúnicochese me me ocrara es que elatacantependráquedinarlymucho tiempo para tratar de encontrar el agoritmo que creamos por medio de php y poder decriptar la cadena final,otendráquehackear el servidor para acceder al php y obtener el algoritmo。
Esto es solo una idea,por lo que si pueden decirme como esto puede no ser seguro,selosagradecería。
答案 10 :(得分:0)
如上所述,这对于服务器欺骗都不安全,因为这需要能够信任客户端Javascript。但是,如果我们确定服务器不能被欺骗(签名证书,散列签名不受长度扩展等影响)但不该连接对窃听者免疫,这是我如何实现它。
我认为最安全的方式是,而不是存储H(密码),其中H是您选择的哈希函数,存储g ^ H(密码),即使用密码作为Diffie-Hellman密钥交换的私钥。 (你也应该为不同的用户使用随机g - 它变成你的盐。)然后验证,你生成一个nonce b,发送用户g ^ b,并计算(g ^ H(密码) 的))^ b。用户不需要知道g - 他们只需要计算(g ^ b)^ H(密码)=(g ^ H(密码))^ b。现在你有一个双方都知道的数字 iff 用户输入了正确的密码,并且基于知道正确的数字构建质询 - 响应零知识证明是微不足道的,而随机数用作服务器"私钥"使该方法免受重放攻击。