SHA1

Diskussion i 'Frågor, support och diskussion' startad av ivarmedi, 26 november 2009.

  1. ivarmedi

    ivarmedi Baby Droid Medlem

    Blev medlem:
    13 juli 2009
    Inlägg:
    24
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej,

    Har lite problem med att generera SHA1-hash. Kodsnutten jag försöker köra är:

    Kod:
    private MessageDigest sha;
    
    [...]
    
    String h = "abc";
    sha = MessageDigest.getInstance("SHA-1");
    sha.update(h.getBytes());
    byte[] b = sha.digest();
    
    Men den ger ingen vettig output alls... Följande värden ligger i b efter digest():

    -87 -103 62 54 71 6 -127 106 -70 62 37 113 120 80 -62 108 -100 -48 -40 99

    Förslag, någon?
     
    Last edited: 26 november 2009
  2. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    På vilket sätt är det fel?

    "Message digests are secure one-way hash functions that take arbitrary-sized data and output a fixed-length hash value."
     
  3. ivarmedi

    ivarmedi Baby Droid Medlem

    Blev medlem:
    13 juli 2009
    Inlägg:
    24
    Mottagna gillanden:
    0

    MINA ENHETER

    Jag får ingen vettig hash alls. Prövade även med MD5, men verkar inte riktigt fungera. Problemet är alltså att jag inte får ut själva hashen. Efter den har digest()at klart kör jag följande:

    Kod:
    hashStr = new String(b);
    
    och får då följande resultat:
    ´┐¢wtzp4Opv´┐¢0aK´┐¢´┐¢´┐¢&↕C↨

    Känns lite galet. Har provat med olika encodings och allt möjligt med liknande resultat.

    Om du har möjlighet att visa en kodsnutt som genererar en SHA1-hash (eller md5) från en String skulle jag vara evigt tacksam.
     
  4. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Det du får tillbaka är binärdata, och representerar inte en sträng på något sätt. Jag vet inte varför du vill göra om det till en sträng, så det är svårt att säga om du vill göra om det till en hex-sträng, eller base64-sträng. Men här är ett exempel på hur du gör om från byte[] till hex-sträng och tillbaka:

    Kod:
    public class HexExample {
    
    	public static void main(String arg[]) {
    		byte[] data = new byte[] { 0, 0, 1, 0, 1, 5, 121, 67, -52, 0, 0 };
    		String hexString = byteArrayToHexString(data);
    		byte[] tmp = hexStringToByteArray(hexString);
    		System.out.println("Are they equal: " + Arrays.equals(data, tmp));
    	}
    
    	public static String byteArrayToHexString(byte[] b) {
    		StringBuilder sb = new StringBuilder(b.length * 2);
    		for (int i = 0; i < b.length; i++) {
    			int v = b[i] & 0xff;
    			if (v < 16) {
    				sb.append('0');
    			}
    			sb.append(Integer.toHexString(v));
    		}
    		return sb.toString().toUpperCase();
    	}
    
    	public static byte[] hexStringToByteArray(String s) {
    		byte[] b = new byte[s.length() / 2];
    		for (int i = 0; i < b.length; i++) {
    			int index = i * 2;
    			int v = Integer.parseInt(s.substring(index, index + 2), 16);
    			b[i] = (byte) v;
    		}
    		return b;
    	}
    
    }
    
    
     
  5. ivarmedi

    ivarmedi Baby Droid Medlem

    Blev medlem:
    13 juli 2009
    Inlägg:
    24
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack så mycket!

    Det var en hexsträng jag ville ha. Fungerar utmärkt!
     
  6. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER