2010-11-15 20 views
3

Pour un prototype d'application, je crée une connexion utilisateur simple. Le mot de passe de l'utilisateur sera alors haché à l'aide de sha224 et transféré au back-end. Le problème auquel je suis confronté en ce moment est le suivant. Le mot de passe qui a été stocké dans la base de données (également haché avec sha224) semble être un peu différent du hash que j'envoie. J'utilise le code suivant pour créer les hachages.Différence entre android sha224 et python sha224

Compte tenu Mot de passe == Test

Python

from hashlib import sha224 
sha224("test").hexdigest() 

android

MessageDigest sha224 = MessageDigest.getInstance("SHA-224"); 
sha224.update(key.getBytes()); 

byte[] digest = sha224.digest(); 
StringBuffer buffer = new StringBuffer(); 

for(int i = 0; i < digest.length; i++) { 
buffer.append(String.valueOf(Integer.toHexString(0xFF & digest[i]))); 
} 

return buffer.toString(); 

Et maintenant sera produit ressemble à ceci et je signalerai les deux hash directement au-dessous L'un et l'autre. (Le premier est python et le second androïde)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

Ils sont presque les mêmes, mais le hachage python a deux 0s plus. Est-ce que vous avez une idée pourquoi?

Répondre

4

Vous ne formatez pas correctement les valeurs hexadécimales sur Android; les 0 principaux sont abandonnés.

buffer.append(String.format("%02x", 0xFF & digest[i])); 
+0

Il est intéressant de noter que tous les zéros ne sont pas supprimés, c'est-à-dire que les premiers chiffres sont 90. Que se passe-t-il? – whatnick

+0

Ah ok 0 dans la position impaire numérotée sont abandonnées Je vais écrire une meilleure explication. – whatnick

+0

@whatnick: La suppression d'autres zéros changerait la valeur. Seuls les zéros en tête ne modifient pas la valeur réelle. –

0
final MessageDigest mDigest = MessageDigest.getInstance("SHA-224"); 
byte[] messageDigest = mDigest.digest(toEncrypt.getBytes()); 
final BigInteger number = new BigInteger(1, messageDigest); 
final String sha = number.toString(16); 
final int diff = 32 - sha.length(); 
final StringBuilder finalSHA = new StringBuilder(32); 
for (int i=0;i<diff;i++) { 
finalSHA.append("0"); 
} 
finalSHA.append(sha); 
return finalSHA.toString(); 
0

vous convertissez l'hexagone de chaîne par paires de deux à la fois. Le premier zéro qui est dropped est au 23, c'est-à-dire une position impaire. C'est un zéro principal. Vous devez mettre à zéro les chiffres hexadécimaux convertis si nécessaire. Implémentation alternative sans BigInteger:

MessageDigest sha224 = MessageDigest.getInstance("SHA-224"); 
sha224.update(key.getBytes()); 

byte[] digest = sha224.digest(); 
StringBuffer buffer = new StringBuffer(); 

for(int i = 0; i < digest.length; i++) { 
    String hex_string = Integer.toHexString(0xFF & digest[i]); 
    if(hex_string.length()==1) hex_string = "0"+hex_string; 
    buffer.append(hex_string); 
} 

return buffer.toString();