Při vývoji javovské aplikace jsem narazil na problém autentifikace uživatelů. Problém spočíval v tom, že mám tabulku uživatelů, která obsahuje hash hesla, který je hashován pomocí PHP.

echo sha1(sha1(„hes­lo“));

Čekal jsem, že v Java API naleznu podobnou metodu na hash Stringu, bohužel jsem hledal marně :)

Jelikož jsem si nevěděl rady, poprosil jsem na konferenci na java.cz o malou pomoc. Po odpovědi obsahující link, na tvorbu hashe ze Stringu, jsem moc moudrý nebyl :(
Potom jsem dostal ovšem odpověď v podobě třídy, kterou jsem nakonec po své úpravě byl schopen aplikovat.

package org.dostal.dochaz­ka.crypt;

import java.security­.MessageDiges­t;
/
 * Statické metody pro výpočet hash
 
 
@author  Ales Dostal;
 /

public class HashUtil {

    public static final String HASH_TYPE = „SHA-1“;

    /

     
konstruktor
     /

    private HashUtil() {}

    /
     
vypocita SHA-1 hashovaci klic z byte[] a vrati jej jako HEXa retezec
     
     
@param pass heslo ve String
     * @return HEXa řetězec
     /

    public static String SHA1AsString(String pass) {
        return SHA1AsString(pas­s.getBytes());
    }

    /

     
vypocita SHA-1 hashovaci klic z byte[] a vrati jej jako HEXa retezec
     
     
@param pass heslo v byte[]
     * @return HEXa retezec
     /

    public static String SHA1AsString(by­te[] pass) {
        return hex(SHA1(pass));
    }

    /
     
vypocita SHA-1 hashovaci klic z char[] a vrati jej jako HEXa retezec
     
     
@param pass heslo v char[]
     * @return HEXa retezec
     /

    public static String SHA1AsString(char[] pass) {
        return SHA1AsString(Strin­g.valueOf(pas­s));
    }

    /

     
Vypočte SHA-1 hashovací klíč z řetězce
     
     
@param secret pomocný klíč
     * @return pole bytů
     /

    private static byte[] SHA1(byte[] pass) {
        byte[] mac = new byte[20];
        try {
            MessageDigest sha = MessageDigest­.getInstance(HAS­H_TYPE);
            sha.update(pas­s);
            mac = sha.digest();
        } catch (Exception e) {
            e.printStackTra­ce();
        }
        return mac;
    }

    /**
     
Převede pole bytů na HEXa řetězec.
     
     
@param data pole bytů
     */

    private static String hex(byte[] data) {
        StringBuilder sb = new StringBuilder();
        for (byte b : data) {
            sb.append(Cha­racter.forDigit((b & 240) >> 4, 16));
            sb.append(Cha­racter.forDigit((b & 15), 16));
        }
        return sb.toString();
    }

 }

Nyní jsem schopen přistupovat k porovnání hashe jak z PHP, tak z Javy. Sice je to taková maličkost, ale občas dost důležitá :)

echo sha1(„heslo“);
System.out.prin­tln(HashUtil.SHA1As­String(„heslo“));