Java将加密的String返回给客户端

时间:2018-01-01 12:09:52

标签: java jsp encryption

我正在使用javax.crypto.Cipher来加密我想要发送回客户端的字符串:

public byte[] encrypt(String message)
        throws Exception {
    Cipher cipher = Cipher.getInstance(m_ALGORITHM);
    PrivateKey privateKey = m_kp.getPrivate();
    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    return cipher.doFinal(message.getBytes());
}

我的加密和解密功能在服务器端运行良好,但当加密的字符串以如下方式返回客户端时:

�zXi�Xq�����.��PiO��dM-�d��a��\`�"����uJ��yu

客户端控制台显示:

Uncaught SyntaxError: Invalid or unexpected token

我尝试过UTF-8格式化String:

String utfEnc = new String(encrypetBytes, "UTF-8");

但它不起作用,我没有想法。

加密是我的jsp页面使用的Java函数(在我的jsp中):

Encryptor enc  = new Encryptor(request);
byte[] encData = enc.encrypt(data);

目标是通过http:

发送此数据
$.ajax({
  type: "POST",
  url: serverUrl,
  data: <%=encData%>, //Uncaught SyntaxError: Invalid or unexpected token
  success: function(){
     console.log('done');
  }
});

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

当你调用doFinal时,你给它一个字节数组而不是字符串。输出是一个字节数组,不一定对应于字符串。这就是你看到所有这些问号的原因。由于您希望通过网络将其作为字符串发送,因此常见的解决方案是使用Base64编码或十六进制将字节数组转换为字符串。 Java 8包含Base64.Encoder类,其中有您可以使用的encodeToString方法。 Base64.Decoder类包含将编码后的字符串转换回原始字节数组的相应方法,然后可以解密。