2009-06-19 11 views
0

Ich habe eine SHA-1 Byte-Array, die ich gerne in einer GET-Anfrage verwenden würde. Ich muss das verschlüsseln. URLEncoder erwartet eine Zeichenfolge, und wenn ich eine Zeichenfolge davon erstellen und dann codieren, wird es beschädigt?Java Kodieren SHA-1 Byte Array

Um zu verdeutlichen, ist dies ein Follow-up zu einer anderen Frage von mir. (Bitorrent Tracker Request) Ich kann den Wert als hexadezimale Zeichenfolge erhalten, aber das wird vom Tracker nicht erkannt. Auf der anderen Seite, codierte Antwort Zeichen zur Verfügung gestellt 200 OK.

Also muss ich die Hex-Darstellung konvertieren, die ich habe:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20 

in kodierter Form

%9A%813%3C%1B%16%E4%A8%3C%10%F3%05%2C%15%90%AA%DF%5E.%20 
+0

ich meinen Beitrag bearbeitet habe neuen Code enthält Ihre editierten Frage zu beantworten. – BobMcGee

Antwort

3

Frage bearbeitet wurde, während ich reagiere, zusätzlicher Code ist folgende und funktionieren soll (mit Code meines Hex-Konvertierung):

//Inefficient, but functional, does not test if input is in hex charset, so somewhat unsafe 
//NOT tested, but should be functional 
public static String encodeURL(String hexString) throws Exception { 
    if(hexString==null || hexString.isEmpty()){ 
    return ""; 
    } 
    if(hexString.length()%2 != 0){ 
    throw new Exception("String is not hex, length NOT divisible by 2: "+hexString); 
    } 
    int len = hexString.length(); 
    char[] output = new char[len+len/2]; 
    int i=0; 
    int j=0; 
    while(i<len){ 
     output[j++]='%'; 
     output[j++]=hexString.charAt(i++); 
     output[j++]=hexString.charAt(i++); 
    } 
    return new String(output); 
} 

Sie werden das rohe Bytes hexadezimale Zeichen konvertieren müssen oder was auch immer URL-freundliche Codierung, die sie verwenden. Base32- oder Base64-Kodierungen sind möglich, aber gerade hexadezimale Zeichen sind am häufigsten. URLEncoder wird für diese Zeichenfolge nicht benötigt, da sie keine Zeichen enthalten darf, die eine URL-Codierung in% NN-Format erfordern.

unten Die wird Bytes für einen Hash (SHA-1, MD5SUM, etc.) in eine hexadezimale Zeichenfolge konvertieren:

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

Dieser Code ziemlich optimiert und schnell, und ich benutze es für meine eigenen SHA -1 Byte Kodierung. Beachten Sie, dass Sie mit der String.toLowerCase() -Methode möglicherweise Großbuchstaben in Kleinbuchstaben konvertieren müssen, je nachdem, welche Form der Server akzeptiert.

0

Dies hängt davon ab, was der Empfänger Ihrer Anfrage erwartet. Ich könnte mir vorstellen, es könnte eine hexadezimale Darstellung der Bytes in Ihrem Hash sein. Eine Zeichenfolge wäre wahrscheinlich nicht die beste Idee, da das Hash-Array höchstwahrscheinlich nicht druckbare Zeichen enthält.

Ich würde über das Array iterieren und Integer.toHexValue() verwenden, um die Bytes in Hex umzuwandeln.

0

SHA1 ist im Hex-Format [0-9a-f], es sollte kein URLE-Code benötigt werden.

+0

SHA1 ist nicht automatisch im Hex-Format. Alle SHA1-Ergebnisse sind ein Array von Bytes. Sie können diese Bytes als hex kodieren. – Jherico