2012-03-12 5 views
32

Sto provando a generare un hash SHA256 in Android, che poi passo a un servizio Web API Web ASP.NET e confrontare l'hash lì. Come tale, ho bisogno di costruire un hash in Android, che dato gli stessi input in ASP.NET genererà un hash equivalente. Mi sto tirando i capelli cercando di capire cosa sto facendo male.Calcola hash SHA256 in Android/Java e C#

Ecco il codice di Android:

public String computeHash(String input) throws NoSuchAlgorithmException{ 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.reset(); 
    try{ 
     digest.update(input.getBytes("UTF-8")); 
    } catch (UnsupportedEncodingException e){ 
     e.printStackTrace(); 
    } 

    byte[] byteData = digest.digest(input.getBytes()); 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < byteData.length; i++){ 
     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return sb.toString(); 
} 

Ed ecco il codice sul server (C#):

private static string ComputeHash(string input, HashAlgorithm algorithm) 
    { 

     Byte[] inputBytes = Encoding.UTF8.GetBytes(input); 
     Byte[] hashedBytes = algorithm.ComputeHash(inputBytes); 

     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < hashedBytes.Length; i++) 
     { 
      sb.Append(String.Format("{0:x2}", hashedBytes[i])); 
     } 

     return sb.ToString(); 
    } 

UPDATE: Ecco l'implementazione di Android/Java corretto (grazie Nikolay Elenkov):

public String computeHash(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException{ 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.reset(); 

    byte[] byteData = digest.digest(input.getBytes("UTF-8")); 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < byteData.length; i++){ 
     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return sb.toString(); 
} 
+2

Non posso credere quanto tempo mi avete salvato oggi. Grazie per aver pubblicato l'aggiornamento. –

+0

Come posso convertire la stringa hash in input originale in java. qualsiasi idea grazie –

+0

Un hash crytpographic è a senso unico ... si prega di consultare il seguente articolo: http://en.wikipedia.org/wiki/Cryptographic_hash_function – Kevin

risposta

20

Il tuo codice Java è sbagliato: stai aggiungendo i byte di input due volte. Se si sta calcolando questo in una volta, è necessario chiamare solo digest(bytes) o chiamare digest() dopo update(bytes);

+0

Boom! Grazie Nikolay. – Kevin