IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Conversion de char[] en byte[]


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut Conversion de char[] en byte[]
    Salut à tous,

    voilà je voudrais convertir un tableau de caractères (char[]) en un tableau de bytes (byte[]).

    Pourquoi je veux faire ça? Pour stocker des mots de passe, je reçois donc un char[] (plus sécurisé qu'un String, voir JPasswordFiled pour savoir pourquoi) , et je dois le hasher. Mais on ne hashe que des byte[], et il n'est pas question de faire (new String(char[])).getBytes() pour les mêmes raisons de sécurité qu'avant.

    Enfin soit là n'est pas la question, je veux juste obtenir le tableau de bytes issu d'un tableau de caractères, comment faire?

    Merci d'avance pour vos réponses
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static byte[] getByteTabFromCharTab(char[] tab) {
       byte[] result = new byte[tab.length];
       for(int i=0; i<tab.length; i++) {
          result[i] = (byte) tab[i];
       }
       return result;
    }
    Pourquoi se compliquer la vie?...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par CyberChouan
    Pourquoi se compliquer la vie?...
    Parce que ce n'est pas si simple : le type char en codé sur 2 octets et le type byte sur un seul... Et que si cela peut passer pour de l'ASCII cela peut poser problème selon le charset utilisé...

    Il faut donc utiliser un Charset pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static byte[] toByteArray(char[] array) {
    		return toByteArray(array, Charset.defaultCharset());
    	}
     
    	public static byte[] toByteArray(char[] array, Charset charset) {
    		CharBuffer cbuf = CharBuffer.wrap(array);
    		ByteBuffer bbuf = charset.encode(cbuf);
    		return bbuf.array();
    	}
    a++

  4. #4
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Hoho merci beaucoup pour le code, mais peux-tu expliciter l'usage du CharSet?
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Razgriz
    Hoho merci beaucoup pour le code, mais peux-tu expliciter l'usage du CharSet?
    Ben, c'est le charset qui permet d'encoder un char en byte(s)...

    a++

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Effectivement, je suis parti du principe que le mot de passe était transmis en ASCII. Mais ton code générique est bien meilleurs
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut Obtenir un byte[] à partir d'un char[] / Ecraser un objet en mémoire
    Salut à tous,

    voilà je voudrais obtenir un tableau de byte à partir d'un tableau de char, et ceci en n'utilisant QUE DES TYPES PRIMITIFS. En effet le password doit être hashé (nécéssite un byte[] en paramètres) et je ne veux pas conserver de trace de ce password en mémoire.
    Du coup je dois obtenir un byte[] et une fois utilisé remplacer tous les éléments des deux tableaux par un élément identique (pour effacer le passage de la mémoire, comme ces données sont des types primitifs je suis certain que ces éléments identiques vont se placer exactement au même endroit en mémoire que les éléments qu'ils remplacent.
    La question 1 est donc : comment obtenir un byte[] à partir d'un char[] ?

    Une autre solution à priori plus simple consiste à faire new String(charArray).getBytes(), ça va me donner un tableau de bytes à partir d'un tableau de char. MAIS j'utilise un String, et donc il y a quelque part en mémoire une trace de mon passage. Pour l'effacer, je dois créer un String d'exactement la m^me taille que le précédent, et le mettre exacteemnt au même endroit en mémoire, seulement voilà, comment puis-je faire ça
    L'alternative est donc : comment écraser un objet en mémoire?
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Tu peux utiliser les ByteBuffer/CharBuffer pour la conversion. Ces classes te laisse manipuler directement leurs buffer pour les effacer

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	public static byte[] toBytes(char[] chars, String charsetName) {
    		// On récupère le charset a utiliser pour la conversion
    		Charset cs = Charset.forName (charsetName);
    		// On mappe un CharBuffer sur notre tableau :
    		CharBuffer cb = CharBuffer.wrap(chars);
    		// On encode ce CharBuffer via le charset :
    		ByteBuffer bb = cs.encode (cb);
    		// On récupère le byte[] associé au ByteBuffer :
    		byte[] bytes = bb.array();
    		// On effectue une copie de la zone qui nous interresse :
    		// (le buffer peut être plus grand) :
    		byte[] result = Arrays.copyOf(bytes, bb.limit());
    		// On 'efface' le buffer du ByteBuffer :
    		Arrays.fill(bytes, (byte)0);
    		// Et on retourne le résultat :
    		return result;
    	}
    a++

    [edit] Nos posts se sont croisés mais tu as loupé ton lien car il renvoi sur cette page

  9. #9
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Je confirme le lien était loupé mais il a été corrigé.

    Sinon ta méthode précédente était-elle meilleure (d'un point de vue sécurité cf ci-dessus) par rapport à celle-ci où ça revient au même?

    [EDIT] Oublie cette question... Tu as fait la même chose... (ou presque) [/EDIT]
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans la seconde version je vide le tableau temporaire et je corrige sa taille (qui peut être plus grande selon le charset).

    a++

    PS : J'ai fusionné les deux discussions...

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut Le pourquoi du comment:
    intéressant:
    http://www.orablogs.com/duffblog/archives/001200.html

    En fait ce n'est pas qu'il ne faut pas utiliser d'objet, mais ne pas utiliser de String parce que c'est immutable: les diférentes méthodes utilisant les Charset ou directement les bytes fonctionnent.

    La seule chose qui est préconisée est de remettre tous les char à 0 après le traitement, pour aeffacer physiquement la mémoire.

    Idem pour tous les objets temporaires qui stockent de mot de passe, avec les setter adéquates, chose impossible avec le String.

    Sinon, on pourrait potentiellement retrouver le mot de passe en scanant la mémoire système (c'est un peu parano quand même, non? )

  12. #12
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Parano, parano, imagne que ce char[] soit un password protégeant le lancement d'un missile nucléaire..... Autant être sur hein ;-)
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut
    il ya des moment ou il faut être parano oui.

    mais lancer un missile nucléaire en Java au secours !

Discussions similaires

  1. Problème de conversion de char en byte
    Par Gouyon dans le forum Langage
    Réponses: 4
    Dernier message: 22/09/2012, 19h15
  2. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  3. conversion de char* en BYTE[]
    Par koukou11 dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 12/03/2011, 14h52
  4. Réponses: 16
    Dernier message: 29/10/2008, 14h33
  5. Réponses: 2
    Dernier message: 01/07/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo