2017-01-02 1 views
0

Je dois prendre ce code C# et faire la même hachage dans Android:Conversion SHA1 de C# android

string result = "2-" + Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.Unicode.GetBytes(password))); 

Je suis en train de réaliser ce but pendant des heures et toujours son hachage différents codes. Merci pour vos réponses.

+0

Qu'avez-vous essayé? Avez-vous regardé les octets bruts? Que se passe-t-il si vous calculez le hachage pour une séquence d'octets donnée? Est-ce différent? – stefan

+0

Lorsque vous parlez de hachage dans Android, vous voulez dire java? Si oui, suivez les conseils de @stefan et vérifiez l'égalité des tableaux d'octets qui en résultent et faites-nous savoir à quoi ils ressemblent. En général, l'algorithme SHA est non spécifique au système, ce qui signifie que vous pouvez exclure la théorie selon laquelle ils ont été calculés de différentes manières (du moins si vous utilisez les fonctions de bibliothèques standard). – Trickzter

+0

Oui, je veux dire java et malheureusement je n'ai pas accès au code C# complet seulement cette partie, j'ai essayé de nombreuses solutions pour hachage en java –

Répondre

0

Ici, nous aller:

try { 
    String password = "qwkld67U"; 
    MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); 
    sha1.update(password.getBytes("UTF-16LE")); 
    String result = "2-" + Base64.encodeToString(sha1.digest(), Base64.DEFAULT); 
    Log.i("SHA1", result); 
} catch (Exception e) { 
    throw new RuntimeException(e); 
} 

La sortie est:

I/SHA1: 2-BePLL+2eth1YOoIcbA5sfzD8Yuw= 

La plupart des gens l'encodage de la chaîne erronée. Encoding.Unicode dans .NET est un codage UTF-16 sans marque d'ordre des octets. L'équivalent Java est UTF-16LE (et pas seulement UTF-16, qui a une marque d'ordre d'octet au début).

Et en ce qui concerne l'anti-modèle de sécurité. Je sais que tu t'en fous. Mais c'est probablement encore pire que ce que je soupçonnais dans mon commentaire (hachage sans sel). Si vous transmettez le mot de passe haché à un serveur et que vous le comparez au mot de passe haché, cela annule complètement le but du hachage du mot de passe. Il est préférable de transmettre le mot de passe en clair sur une connexion cryptée que de transmettre le mot de passe haché. Faites savoir à ceux qui sont chargés de la conception de la sécurité.

+0

Wow, merci beaucoup son fonctionnement parfait! –

+0

Désolé pour le spam, mais la raison pour laquelle je m'en fous est que le produit sur lequel je travaille n'est pas le mien, je peux lui dire que c'est contre la sécurité, mais c'est à lui de décider comment cela va se faire. –