【问题标题】:Different results for decodeBase64 in Glassfish and TomcatGlassfish 和 Tomcat 中 decodeBase64 的不同结果
【发布时间】:2014-11-25 14:35:12
【问题描述】:

我有一个值,我用特殊字符编码,然后使用 base64 再次编码,我的开发环境是标准使用 Netbeans glassfish 服务器,但网站托管在 Tomcat 服务器上,我似乎得到了完全相同的不同结果解密代码/功能,它在netbeans中完美运行,但在tomcat上失败,使我的特殊字符解码代码失败,因为字符不一样

String key = enc_key;

// Create key and cipher
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");

// decrypt the text
cipher.init(Cipher.DECRYPT_MODE, aesKey);
strDecrypted = new String(cipher.doFinal(Base64.decodeBase64(encrypted.getBytes())));

任何建议 :-( ?

【问题讨论】:

  • 简而言之:使用String.getBytes(Charset.forName("UTF-8"))String(arrayOfBytes,Charset.forName("UTF-8")),否则你永远不会知道它使用了哪个字符集
  • @Pablo:从 Java 7 开始,使用StandardCharsets.UTF_8
  • 哎哟!诚然,当你坚持“公司标准”(又名“Java 6 有效,请勿触摸”)时,就会发生这种情况
  • 添加了编码,但这是我在 Netbeans glassfish 上得到的 Z,¡Eð¥Õ[’ý¿È¼jİø»4[ Ã?I¿Ã~Å¡+Y'':ø{@âVމ 在 tomcat 中我知道哪个是正确的Z,¡Eð¥Õ[ ’ý¿È¼jİø»4[ÃÂI¿Ã~Å¡+Y'':ø{@âVކ° 这是错误的 :-( :-( 为什么?为什么?为什么?问号表示错误

标签: java tomcat encryption glassfish base64


【解决方案1】:

您正在使用 String(byte[]) 构造函数,但未指定编码。不要那样做。

同样,不要在没有指定编码的情况下调用String.getBytes()。您在向我们展示的代码中这样做了两次 - 我的猜测是您在加密数据时这样做了。 总是指定你想使用的编码。

现在我们不知道您正在使用哪个 Base64 类,但我个人会尝试找到一种接受 String 以解码开头的方法 - Base64 在逻辑上是 byte[] <==> String 转换方案,因此,在一个不错的 API 中,您将拥有 String encode(byte[])byte[] decode(String)

【讨论】:

  • 感谢您的回答,您最好建议我对特殊字符使用什么编码?
  • @Lappies:我建议使用 UTF-8 everywhere。另请注意,实际上并没有“特殊字符”这样的概念 - 任何时候您使用该术语时,您都应该尝试更准确地说明您要表示的内容。
  • 添加了编码,但这是我在 Netbeans glassfish 上得到的 Z,¡Eð¥Õ[’ý¿È¼jİø»4[ Ã?I¿Ã~Å¡+Y'':ø{@âVމ 在 tomcat 中我知道哪个是正确的Z,¡Eð¥Õ[ ’ý¿È¼jİø»4[ÃÂI¿Ã~Å¡+Y'':ø{@âVކ° 这是错误的 :-( :-( 为什么?为什么?为什么?问号表示错误
  • @Lappies:这似乎不是一开始的文字。数据意味着什么?您是否也修复了 encrypting 部分以指定编码?
  • 加密后的文本看起来像 123HGW457#-#7939#-#777,然后使用密码和 128 位密钥进行加密
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2016-12-01
  • 2015-04-22
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多