我将客户端数据以下列格式发布到服务器。
$.ajax({
type: 'post',
url: 'rest/server',
data: JSON.stringify(frmData),
contentType: "application/json; charset=utf-8",
success: function (data) {
...
}
});
发送到服务器(java)时,如何以及加密/解密或生成密钥值对的最佳选项是什么,以避免发布不应发送的数据?例如。如果表单元素包含与用户相关的值,则该用户可以将其他值发送到服务器以进行发布。
目前,我无法选择HTTPS / SSL。
答案 0 :(得分:1)
Herr K收集了一些JavaScript加密方法here。没有最好的,您需要根据与Java的互操作性选择一个,但forge可能使用RSA和适当的填充方案为Java提供匹配的功能。在我看来,这只能防止被动的攻击者"谁不能操纵请求。
因此,您可以使用您选择的方法生成公钥/私钥对,并将公钥嵌入客户端代码中。然后,您将使用客户端上的公钥进行加密,并使用服务器上的私钥进行解密。
您需要将contentType设置为text/plain
。
要从服务器接收加密响应,应该稍微扩展一下。由于需要像RSA这样的非对称密码,客户端只有公钥,服务器只有私钥,服务器只能签署带有RSA的消息,但不能加密它。因此,客户端需要生成AES密钥并将其发送到服务器,服务器将使用此密钥进行安全响应。通过安全,我的意思是该消息将是保密的,但可能不是真实的。所以应该添加某种类型的MAC。
为了进一步扩展,在第一条消息上,客户端生成AES密钥并使用此密钥加密实际消息,并另外使用RSA加密AES密钥(这称为混合加密)。服务器使用AES加密消息进行响应。对于会话的其余部分,仅使用AES。 RSA仅在会话开始时用于建立会话密钥。这是手工制作的SSL,不使用浏览器的SSL功能。
答案 1 :(得分:1)
我想知道你是否在谈论在按下提交按钮之前试图阻止人们操纵锁定或隐藏的表单字段?
使用firebug等工具更改隐藏的输入值非常容易,例如ids,人们可以通过javascript代码查看您的API。即使有混淆,也没有100%的方法可以防止这种操作。在通信级别实现的数据加密/解密不会停止在浏览器/客户端级别(如隐藏字段)处理事物。
关键是,如果您不想修改数据,则不应该首先将其发送到客户端。当您再次收到它们时,您不能依赖隐藏的输入值来保持不变。使用隐藏的输入字段来跟踪状态有时更方便,但是当安全性更重要时,您应该使用服务器端会话。
如果要检测某些值是故意更改的,可以使用哈希签名。
如果没有更详细的例子说明您所谈论的数据和背景,很难说最适合您的是什么。
答案 2 :(得分:1)
通过电子邮件向您的用户发送密钥,并让用户将该密钥插入输入字段(屏蔽为密码)..不要将密钥保存在代码中的任何位置 - 只需签名数据并将其发布到您的服务器..它是真的不推荐但它是我找到的唯一合理的解决方案