JavaScript是否有任何非对称加密选项?

| 我必须通过未加密的通道(HTTP,而不是HTTPS)通过JavaScript AJAX调用传输一些敏感信息。 我想对数据进行加密,但是JavaScript方面的加密意味着我公开了密钥,这使得对称加密仅是出于默默无闻的安全目的。 JavaScript是否有任何非对称加密?这样,我可以将服务器解密密钥保密。 (我不担心服务器> JavaScript消息的安全性,只担心某些JavaScript>服务器消息的安全性)     
已邀请:
根本需要加密的原因可能是为了防止中间人。在某些情况下,攻击者可以在不更改流量的情况下嗅探流量。该解决方案可以抵御这种威胁,但是对于能够修改流量的中间人而言,它根本无法提供任何保护。 如果攻击者可以更改流量,则他也将能够更改执行加密的脚本。最简单的攻击是仅从脚本中完全删除加密。如果您没有https,并且可以使用中间人(几乎在每种情况下都是这种情况),那么您根本无法控制呈现给的html或javascript最终用户。攻击者可能会完全重写您的html代码和javascript,禁用加密,在您的表单中创建新的表单字段等。Https是在Web通道中进行安全通信的先决条件。     
我已经做到了。我使用此JavaScript客户端非对称RSA加密来防止登录凭据通过HTTP以纯文本格式发送。 目的是防止基于网络嗅探的登录请求重播攻击。当然,它不像HTTPS那样安全,因为它不能抵抗中间人攻击,但是对于本地网络而言已经足够。 客户端加密使用了基于JSBN的Travis Tridwell的出色工作。 Travis的网页还可以生成私有和公共RSA密钥(如果您太懒了而无法使用
openssl
)。密钥以PKCS#1 PEM格式生成。我对“ 1”进行加密,以便每次登录时加密的内容都会更改。 在服务器端,我的Java代码使用Apache JMeter的
org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader
读取了PKCS#1 PEM文件:
PrivateKey pk = (new PrivateKeyReader(\"myPrivateKeyFile.pem\")).getPrivateKey();
然后我使用
byte[] enc = DatatypeConverter.parseBase64Binary(clientData);
Cipher rsa = Cipher.getInstance(\"RSA\");
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] dec = rsa.doFinal(enc);
String out = new String(dec, \"UTF8\");
然后,我检查客户端时间戳/时区是否与服务器端时间戳/时区匹配。如果延迟少于几秒钟,则登录过程将继续。否则,该请求将被视为重播攻击,并且登录失败。     
这个问题似乎有您要解决的问题,JavaScript密码术库在浏览器中对表单数据进行签名PGP链接:http://www.hanewin.net/encrypt/具有RSA     
服务器> JavaScript消息是否通过HTTPS发送? 如果没有,那么什么也不会阻止中间人更改脚本。如果可以访问未加密数据的代码遭到破坏,则任何加密都是无用的。     
不对称的公钥/私钥是唯一的方法。为了防止MIM攻击,服务器可以使用用户密码对公钥进行哈希处理,然后用户(在浏览器中)将重新计算哈希值-如果匹配,则用户可以确信服务器发送的公钥没有被篡改-这取决于只有服务器和用户才知道用户密码的事实。 附言:我想以此作为评论,因为它比答案更合适,但我的观点不够:)     

要回复问题请先登录注册