我需要通过JavaScript AJAX调用在未加密的通道(HTTP,而非HTTPS)上传输一些敏感信息。
我想加密数据,但在JavaScript端进行加密意味着我会暴露密钥,这使得对称加密只是一种安全性混淆的练习。
是否有适用于JavaScript的非对称加密方法?这样,我就可以保持服务器解密密钥的机密性。(我不担心服务器> JavaScript消息的安全性,只关注某个JavaScript >服务器消息的安全性)
我需要通过JavaScript AJAX调用在未加密的通道(HTTP,而非HTTPS)上传输一些敏感信息。
我想加密数据,但在JavaScript端进行加密意味着我会暴露密钥,这使得对称加密只是一种安全性混淆的练习。
是否有适用于JavaScript的非对称加密方法?这样,我就可以保持服务器解密密钥的机密性。(我不担心服务器> JavaScript消息的安全性,只关注某个JavaScript >服务器消息的安全性)
你需要加密的原因可能是为了防止中间人攻击。在某些情况下,攻击者可以监听流量但无法修改它。这种解决方案将防止该威胁,但不提供任何保护来抵御能够修改流量的中间人攻击。
如果攻击者可以更改流量,那么他也将能够更改执行加密的脚本。最简单的攻击方式就是从脚本中完全删除加密。如果您没有使用 https,并且中间人攻击是可能的(几乎每种情况都是如此),则您对呈现给终端用户的 html 或 javascript 没有任何控制权。攻击者可以完全重写您的 html 代码和 javascript、禁用加密、在表单中创建新的表单字段等。在 web 渠道中进行安全通信的先决条件是使用 https。
我做到了。我使用这个JavaScript客户端的非对称RSA加密来防止登录凭证以明文形式通过HTTP发送。
目的是为了防止基于网络嗅探的登录请求重放攻击。当然,这并不像HTTPS那样安全,因为它不能抵御中间人攻击,但对于本地网络可能已经足够。
客户端加密使用Travis Tridwell的优秀作品,它基于JSBN。Travis的网页也可以生成私钥和公钥RSA密钥(如果您懒得使用openssl
)。密钥以PKCS#1 PEM格式生成。我加密 username+password+timeInMs+timezone
以使加密内容在每次登录时更改。
在服务器端,我的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消息是否通过HTTPS发送?
如果没有,那么中间人可以更改脚本。如果能够访问未加密数据的代码被破坏,任何加密都将无用。