【问题标题】:Thales HSM - Windows cp 1252 succes / Linux UTF-8 FailThales HSM - Windows cp 1252 成功/Linux UTF-8 失败
【发布时间】:2015-10-19 08:28:19
【问题描述】:

我正在开发带有 HSM 模块集成的 TCP/IP 应用程序。 我的 JAVA 代码在 Windows 32 位/JRE 32 位/IBM Websphere 7 中运行良好, 当我升级到 RedHat Linux-64 位/JRE 64 位/IBM webshere 8 时,如果我发送低于 127 长度的字符串工作正常,但超过 127 则返回响应。我也做了一些编码技术,但是面对同样的pblm请指导我。

如果 commandLength = 小于 127,工作正常,但大于 127 [UTF-8 编码失败] 因此,对于超过 127 个,我正在使用扩展 ascii,但它在 [UTF-8] 中不起作用/在 windows-1252 中工作正常 //hsmMessage.insert(0, (char)commandLength);

         char[] extended_ascii = new char[1];           
         byte cp437bytes[]= new byte[1];                
         cp437bytes[0] = (byte) commandLength;      
         extended_ascii = new String(cp437bytes).toCharArray();     //extended_ascii = new String(cp437bytes, "CP437").toCharArray();
         hsmMessage.insert(0, extended_ascii);

谢谢

【问题讨论】:

  • 贴一些你试过的代码。
  • 您使用Strings 交换加密数据的事实本身就已经令人怀疑。发布您正在使用的代码。

标签: java linux utf-8 hsm


【解决方案1】:

永远不要使用 String 对象来保存任意二进制数据 - 使用 byte 数组或其包装器。

原因是当从字节数组转换为字符串时,给定的语言环境用于将字节转换为字符对象,这在许多情况下最终会导致字符串不包含您认为应该包含的确切字节,尤其是对于字节值 >= 128。

多年前,我在编写的 RADIUS 服务器中遇到了非常类似的问题。它适用于绝大多数密码,但如果用户密码中有 £ 符号,则 US-ASCII 和 UK-ASCII 之间的差异会导致底层字节值被破坏,从而导致计算错误的加密密码,以及登录失败。

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2018-11-12
    • 2014-05-06
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多