2009-06-30 14 views
1

Je dois analyser quelque chose comme le suivant "du texte < 40 haste hash>" puis-je lire tout cela dans une chaîne sans corrompre la partie de hachage de 40 octets?SHA-1 Hashs mélangés avec des chaînes

La chose est hash ne va pas être là, donc je ne veux pas le traiter en lisant.

EDIT: J'ai oublié de mentionner que le hachage de 40 octets est 2x20 octets hache aucun octet de codage brut.

+0

Qu'est-ce que avez-vous fini par aller avec? – codethulhu

Répondre

0

Les hachages SHA-1 ont une longueur de 20 octets (160 bits). Si vous traitez des hachages de 40 caractères, alors ils sont probablement une représentation ASCII du hachage, et ne contiennent donc que les caractères 0-9 et a-f. Si c'est le cas, vous devriez pouvoir lire et manipuler les chaînes de Java sans aucun problème.

+0

Modifier pour indiquer que le hachage de 40 octets est de 2, 20 octets sha-1 ne hache aucun encodage. –

0

Quelques détails supplémentaires pourraient être utiles, mais je pense que la réponse est que vous devriez aller bien.

Vous n'avez pas dit comment le hachage SHA-1 a été codé (les possibilités les plus courantes sont "none" (les octets bruts), Base64 et hex). Puisque SHA-1 produit un hachage de 20 octets (160 bits), je suppose qu'il sera codé en hexadécimal, puisque cela double l'espace nécessaire aux 40 octets que vous avez mentionnés. Avec ce codage, 2 caractères seront utilisés pour encoder chaque octet du hachage, en utilisant les symboles 0 à 9 et A à F. Ce sont tous des caractères ASCII, donc vous êtes en sécurité.

Le codage Base64 fonctionnerait également (bien que ce ne soit probablement pas ce que vous avez demandé car il augmente la taille d'environ 1/3, vous laissant à moins de 40 octets) car chacun des caractères utilisés dans Base64 est également ASCII.

Si les octets bruts étaient utilisés directement, vous auriez un problème, car certaines des valeurs ne sont pas des caractères valides.

0

OK, maintenant que vous avez précisé que ce sont des octets bruts

Non, vous ne pouvez pas lire en Java comme une chaîne, vous aurez besoin de le lire en octets bruts.

0

CODE DE TRAVAIL: convertit les signaux chaîne d'octets en caractères hexadécimaux qui devraient être en sécurité dans presque tous les codages de chaîne. Utilisez le code que j'ai posté dans votre autre question pour décoder les caractères hexadécimaux en octets bruts.

/** Lookup table: character for a half-byte */ 
    static final char[] CHAR_FOR_BYTE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
    /** Encode byte data as a hex string... hex chars are UPPERCASE */ 
    public static String encode(byte[] data){ 
     if(data == null || data.length==0){ 
      return null; 
     } 
     char[] store = new char[data.length*2]; 
     for(int i=0; i<data.length; i++){ 
      final int val = (data[i]&0xFF); 
      final int charLoc=i<<1; 
      store[charLoc]=CHAR_FOR_BYTE[val>>>4]; 
      store[charLoc+1]=CHAR_FOR_BYTE[val&0x0F]; 
     } 
     return new String(store); 
    } 
1

Lire à partir de votre flux d'entrée comme un flux d'octets, et dans la bande puis la chaîne du flux comme celui-ci:

String s = new String(Arrays.copyOfRange(bytes, 0, bytes.length-40)); 

Ensuite, récupérez vos octets comme:

byte[] hash = Arrays.copyOfRange(bytes, s.length-1, bytes.length-1)