Maison >Java >javaDidacticiel >Comment éviter les problèmes de conversion lors du chiffrement de données entre des tableaux d'octets et des chaînes ?

Comment éviter les problèmes de conversion lors du chiffrement de données entre des tableaux d'octets et des chaînes ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-19 09:15:03302parcourir

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

Résoudre les problèmes de conversion entre les tableaux d'octets et les chaînes dans le cryptage

Dans le contexte du cryptage, la conversion des tableaux d'octets en chaînes et inversement peut poser des problèmes, entraînant souvent des valeurs incompatibles et des erreurs de décryptage. Voici une exploration de ces problèmes et une solution détaillée.

Considérez le scénario de chiffrement suivant :

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");
    }
}

Cependant, le stockage de données chiffrées sous forme de chaînes est déconseillé en raison de leur utilisation prévue à des fins lisibles par l'homme. du texte, pas des données binaires arbitraires. Si cela est inévitable, utiliser un encodage avec un mappage 1 à 1 entre les octets et les caractères est crucial.

Encodage ISO-8859-1

Pour ce scénario spécifique , l'encodage ISO-8859-1 est recommandé :

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

Éviter les Pièges d'encodage

L'encodage UTF-16 peut causer des problèmes car :

  • String.getBytes("UTF-16") ajoute un caractère marqueur d'ordre des octets.
  • Toutes les séquences d'octets ne peuvent pas être mappées sur des caractères UTF-16 (par exemple, des séquences de 4 octets avec des caractères invalides mappages).

Encodages alternatifs

Si ISO-8859-1 ne répond pas à vos exigences, envisagez d'utiliser un encodage hexadécimal ou base64. Cependant, celles-ci nécessitent des bibliothèques d'assistance supplémentaires car elles ne sont pas définies dans l'API standard.

En respectant ces directives et en utilisant un encodage approprié, vous pouvez résoudre les écarts entre les tableaux d'octets et les chaînes dans votre processus de chiffrement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn