如何在没有HTTPS的情况下使用JavaScript通过HTTP安全地发送密码?

所有开发人员都面临的基本问题是:无论何时用户提交表单,密码都是通过networking发送的,并且必须受到保护。 我开发的网站没有HTTPS。 所有者也不想购买SSL证书,也不想购买自己的SSL证书。 所以我想在提交表单时保护通过HTTP使用JavaScript发送的密码。

渴望downvoters: 如何通过HTTP安全地发送密码? 没有给出任何明智的解决办法,我处于另一种情况。

如果我使用MD5,则可以反转该密码string。 那么nonce / HMAC呢? 任何可用的Javascript库? 或者你有什么build议/暗示来解决? 提前致谢!

没有办法安全地发送密码,用户可以validation没有SSL。

当然,你可以编写一些JavaScript,通过哈希或公钥encryption,为密码传输提供安全的密码。 但是,用户如何确保JavaScript本身在到达之前没有被中间人篡改,将密码发送给攻击者而不是网站,甚至只是危及安全性algorithm? 唯一的办法就是让他们成为专业的程序员,让他们检查你的页面和脚本的每一行,以确保在input密码之前它是洁净的。 这不是一个现实的情况。

如果您想让密码从中间人攻击中安全,您必须购买SSL证书。 没有别的办法。 习惯它。

如果我使用MD5,则可以反转该密码string。

不…至less不平凡。 虽然MD5有攻击它,它是一个哈希algorithm,因此不可逆转。 你将不得不暴力。

但同样,中间人攻击者不需要看你的MD5。 他可以简单地破坏你发送用户制作MD5的JavaScript。

这里的解决scheme是根本不发送密码。 使用挑战/回应。

在原始forms中包含一个随机文本和一个键的大块。 根据服务器上的密钥将原始随机文本存储在会话中。 当客户端提交表单时,使用JS将随机文本和密码散列在一起。 然后将用户名,密钥和散列随机文本发送到服务器。 不要发送密码。 在服务器上,使用键查找原始随机文本,使用存储的密码执行相同的哈希操作。 如果服务器散列值与客户端散列值相匹配,那么您知道客户端input了正确的密码,而没有将密码发送到服务器。

密码是否正确,过期密钥和随机文本是一次性使用的。

如果您真的想深入研究这个问题,可以看看Diffie-Hellman密钥交换 ,这个密钥交换是为了“允许没有彼此先验知识的双方通过不安全的通信通道共同build立共享密钥”

我不是密码专家,所以我不完全知道如果攻击者同时拥有客户端(JavaScript源代码)和传输机制(包嗅探器)

您可以在发送之前使用JavaScript RSA实现来encryption密码。 (这里是一个JavaScript中的RSA的例子。)

但是我相信这个和使用散列函数都会容易受到重播攻击 。 所以,小心点

不幸的是,将无法确保未encryption请求的安全性。 任何有权访问您的JavaScript的人都可以简单地对其进行反向工程/篡改,任何拥有数据包嗅探器的人都将能够观看未encryption的stream量。 这两个事实共同意味着:

没有SSL? 没有安全。

你有任何传输将是明确的; 也就是说,没有SSL,您的关键信息将被暴露。 这是值得与网站所有者讨论这一点。 换句话说,最好采取必要的措施来加强你的数据传输,SSL是你可以采取的基本的,便宜的步骤之一。

我不认为这里的问题是技术,但是你如何解释SSL的重要性。 为他们提供可靠的阅读材料,我相信网上有很多。

该解决scheme要求客户端能够使用由客户端服务器知道的秘密encryption密钥来encryption密码。

SSL通过要求服务器和客户端Web浏览器具有它们自己的非对称公钥/私钥对来完成这个任务,它们用来encryption和发送它们之间的随机会话密钥。 对话的其余部分将使用该安全会话密钥。

所以你问如何解决与SSL相同的问题,而没有只有客户端和服务器知道的秘密密钥的好处。 我不是专家,但看起来这是不能做的,或者至less不容易。

如果您无法访问SSL,则MD5应足以防止意外发现密码(例如在networking日志文件中)。 别的什么都会浪费时间。 只要确保应用程序不允许访问敏感信息(即信用卡号码,病史等)。

像其他评论者所build议的那样,严重的攻击者将能够打破页面上的任何types的安全。 即使SSL是一个小屏障,因为大多数用户使用易于猜测的密码,在任何地方重复使用相同的密码,将密码提供给任何人询问,或者可以通过复制的页面被骗取放密码。支持“电话。

– 英语 – 我在想什么,但我不知道它是否真的很安全。 如果你可以把你的表单放在一个php文件中,那么你可以创build一个algorithm来创build一个基于时间的string或其他的东西,然后把这个string放到你的html中。

当用户在密码input字段中input密码时,在debugging时不能看到用户input的值,所以在通过post或get发送信息之前,可以使用密码用户提示来encryption已经encryption的string生成,然后,只是发送由用户键入的密码insted。

通过这种方式,攻击者不必拥有js代码,所以他们需要发现你创build的解密algorithm。

这只是一个想法,所以如果你能告诉我这是不是安全的,我将不胜感激。

– 西class牙语 – Se me acaba de ocurrir algo que puede servir,pero no se si si realmente sea algo seguro。 Por medio de php puedes generar un algoritmo que cree un string en base base timestamp o algomás,ydespuéscolocar esta cadena en el html。

请注意,如果使用的是用户名和密码,则可以使用该用户名和密码。注意:如果用户input了密码,则不能debugging用户名和密码。 como palabra clave para encriptar la cadena de texto que previamente habiamos generado con php,por medio de un algoritmo en JS。 Seríaalgoasícomo encriptar lo encriptado。 Posteriormente lo que estariamos enviado noseríalacontraseñatecleada,si no estaúltimacadena resultante。

Buscando un contra,loúnicoque se me ocurra es el el atacantetendráque dedicarle mucho tiempo para tratar de encontrar el agoritmo que creamos por medio de php y poder decriptar la cadena final,otendráque hackear 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,se losagradecería。

如前所述,这对于服务器欺骗是没有安全的,因为这需要信任客户端Javascript的能力。 但是如果我们确信服务器不能被欺骗(签名的证书,散列签名不受长度扩展的影响等),而不是连接对于窃听者是免疫的,这就是我如何实现的。

我认为最安全的方法是,不要存储H( 密码 ),其中H是您select的哈希函数,请存储g ^ H( 密码 ),即使用密码作为Diffie-Hellman密钥交换的私钥。 (你也应该为不同的用户使用一个随机的g,它会变成你的盐)。然后validation,你生成一个随机数b,发送用户g ^ b,并计算(g ^ H( password ))^湾 用户不需要知道g-他们只需要计算(g ^ b)^ H( 密码 )=(g ^ H( 密码 ))^ b。 现在你有一个号码,双方都知道用户是否input了正确的密码,在知道正确号码的基础上构造一个挑战 – 应答零知识certificate是微不足道的,而用作服务器“私钥”的随机数使得方法免疫重播攻击。