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é.
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
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
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 –