首頁 >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