Java6和Java8之间对河豚的不同结果

Java6和Java8之间对河豚的不同结果,java,encryption,blowfish,Java,Encryption,Blowfish,如果我用java 6 oracle运行这段代码,然后用java 8运行openJdk会给我不同的输出,为什么?我发现了问题,感谢大家的帮助,是UTF-8,在java 6和7中,实现不同于java 8,java 6 IBM,帮助我在jdk 6上实现openJdk 8中的UTF_8.class。如需更多帮助,请查看此处 只需使用新字符串(arrayByte,new CustomCharset()),结果如何?java 6:����?� 和java 8:����?��你能把输出转换成base64吗?

如果我用java 6 oracle运行这段代码,然后用java 8运行openJdk会给我不同的输出,为什么?

我发现了问题,感谢大家的帮助,是UTF-8,在java 6和7中,实现不同于java 8,java 6 IBM,帮助我在jdk 6上实现openJdk 8中的UTF_8.class。如需更多帮助,请查看此处


只需使用
新字符串(arrayByte,new CustomCharset())

,结果如何?java 6:����?� 和java 8:����?��你能把输出转换成base64吗?那么它们是相等的@kelalaka,为什么?如果与字符串比较,则它们不是
返回新字符串(cipher.doFinal(source.getBytes(“UTF-8”))这几乎总是一个bug,在本例中就是这样。字符串并不意味着是任意字节序列的持有者。数据在此过程中已损坏。可能是java 6和java 8之间的默认字符集发生了变化,这是另一个教训:永远不要使用默认字符集。您能将代码写入解决方案吗?实际上,我们更喜欢base64编码/解码。@Kelalalaka base64或字节到十六进制是一种方法,但在传统系统中,他们使用字节到UTF-8,然后使用十六进制并将密码保存到数据库中,问题是我必须使用UTF-8,因为密码是以这种方式加密的。因此,在jdk6和JDK6IBM中,它们以不同的方式为无效字符实现UTF-8。所以我复制了OpenJdk 8的实现,现在可以工作了。这也不起作用,因为你无法解密你加密的内容。您必须将其用作某种自制的密码哈希。CustomCharset类的代码太多,无法读取,但此方案会大大削弱已经很弱的密码身份验证方案。阅读本文的任何其他人都不应该使用这种方法。@PresidentJamesK.Polk是的,但就我而言,这是一个非常古老的遗留系统,几个月后就会消亡,这更像是一个修补程序。
public class Main {

public static void main(String[] args) {
    String result = blowfish("123123");
    System.out.println(result);
}

public static String blowfish(String source) {
    final String BLOWFISH_KEY = "22ddba9832444234";

    try {
        Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");

        cipher.init(
                Cipher.ENCRYPT_MODE,
                new SecretKeySpec(BLOWFISH_KEY.getBytes("UTF-8"), "Blowfish")
        );
        return new String(cipher.doFinal(source.getBytes("UTF-8")));

    } catch (Exception e) {
        e.printStackTrace(System.out);
        return null;
     }
   }
}