首页 >Java >java教程 >加密字节数组和字符串之间的数据时如何避免转换问题?

加密字节数组和字符串之间的数据时如何避免转换问题?

Barbara Streisand
Barbara Streisand原创
2024-11-19 09:15:03303浏览

How Do I Avoid Conversion Issues When Encrypting Data Between Byte Arrays and Strings?

解决加密中字节数组和字符串之间的转换问题

在加密环境中,将字节数组转换为字符串并返回可能会带来挑战,通常会导致值不匹配和解密错误。以下是对这些问题的探索和详细的解决方案。

考虑以下加密场景:

public class NewEncrypter {

    // Encryption and decryption are performed on byte arrays, not strings
    public byte[] encrypt(String input) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(input.getBytes("UTF-16"));
    }

    public String decrypt(byte[] encryptionBytes) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(encryptionBytes), "UTF-16");
    }
}

但是,不鼓励将加密数据存储为字符串,因为它们的预期用途是供人类可读文本,而不是任意二进制数据。如果不可避免,那么使用字节和字符之间一对一映射的编码至关重要。

ISO-8859-1 编码

对于此特定场景,建议使用 ISO-8859-1 编码:

    String decoded = new String(encryptedByteArray, "ISO-8859-1");
    byte[] encoded = decoded.getBytes("ISO-8859-1");

避免常见的编码陷阱

UTF-16 编码可能会导致问题,因为:

  • String.getBytes("UTF-16") 添加字节顺序标记字符。
  • 并非所有字节序列都可以映射到 UTF-16 字符(例如,具有无效字符映射的 4 字节序列).

替代编码

如果 ISO-8859-1 不满足您的要求,请考虑使用十六进制或 base64 编码。但是,这些需要额外的帮助程序库,因为它们没有在标准 API 中定义。

通过遵守这些准则并使用适当的编码,您可以解决加密过程中字节数组和字符串之间的差异。

以上是加密字节数组和字符串之间的数据时如何避免转换问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn