Chaîne Java vers SHA1

J’essaie de faire un simple convertisseur Ssortingng to SHA1 en Java et c’est ce que j’ai …

public static Ssortingng toSHA1(byte[] convertme) { MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-1"); } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } return new Ssortingng(md.digest(convertme)); } 

Quand je le passe à toSHA1("password".getBytes()) , j’obtiens “[ a ɹ ?? % l 3 ~ .” Je sais que c’est probablement un correctif de codage simple comme UTF-8, mais est-ce que quelqu’un pourrait me dire ce que je devrais faire pour obtenir ce que je veux qui est “5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8”? Ou est-ce que je fais cela complètement faux?

Merci beaucoup!

METTRE À JOUR
Vous pouvez utiliser Apache Commons Codec (version 1.7+) pour effectuer ce travail pour vous.

  DigestUtils.sha1Hex (ssortingngToConvertToSHexRepresentation) 

Merci à @ Jon Onstott pour cette proposition.


Ancienne réponse
Convertissez votre tableau d’octets en chaîne hexadécimale. Comment ça va vous dire comment .

 return byteArrayToHexSsortingng(md.digest(convertme)) 

et (copié à partir du comment de Real)

 public static Ssortingng byteArrayToHexSsortingng(byte[] b) { Ssortingng result = ""; for (int i=0; i < b.length; i++) { result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 ); } return result; } 

BTW, vous pouvez obtenir une représentation plus compacte en utilisant Base64. Apache Commons Codec API 1.4 , a cet utilitaire agréable pour éliminer toutes les douleurs. se référer ici

Ceci est ma solution de conversion de chaîne en sha1. Cela fonctionne bien dans mon application Android:

 private static Ssortingng encryptPassword(Ssortingng password) { Ssortingng sha1 = ""; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(password.getBytes("UTF-8")); sha1 = byteToHex(crypt.digest()); } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } catch(UnsupportedEncodingException e) { e.printStackTrace(); } return sha1; } private static Ssortingng byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } Ssortingng result = formatter.toSsortingng(); formatter.close(); return result; } 

Utilisation de la classe Guava Hashing :

 Hashing.sha1().hashSsortingng( "password", Charsets.UTF_8 ).toSsortingng() 

SHA-1 (et tous les autres algorithmes de hachage) renvoient des données binarys. Cela signifie que (en Java) ils produisent un byte[] . Ce tableau d’ byte ne représente aucun caractère spécifique, ce qui signifie que vous ne pouvez pas simplement le transformer en Ssortingng comme vous l’avez fait.

Si vous avez besoin d’une Ssortingng , vous devez formater cet byte[] d’une manière qui peut être représentée sous forme de Ssortingng (sinon, conservez simplement l’ byte[] .

Deux manières courantes de représenter des byte[] arbitraires byte[] tant que caractères imprimables sont BASE64 ou des hexagones simples (représentant chaque byte par deux chiffres hexadécimaux). On dirait que vous essayez de produire une chaîne hexadécimale.

Il y a aussi un autre piège: si vous voulez obtenir le SHA-1 d’une Ssortingng Java, vous devez d’abord convertir cette Ssortingng en un byte[] (car l’entrée de SHA-1 est également un byte[] ). Si vous utilisez simplement mySsortingng.getBytes() comme vous l’avez montré, alors il utilisera l’encodage par défaut de la plate-forme et en tant que tel dépendra de l’environnement dans lequel il est exécuté (par exemple, il pourrait renvoyer des données différentes votre système d’exploitation).

Une meilleure solution est de spécifier l’encodage à utiliser pour la conversion Ssortingng to- byte[] comme ceci: mySsortingng.getBytes("UTF-8") . Choisir UTF-8 (ou un autre encodage pouvant représenter tous les caractères Unicode) est le choix le plus sûr.

Utilisez simplement la bibliothèque de codecs apache commons. Ils ont une classe utilitaire appelée DigestUtils

Pas besoin d’entrer dans les détails.

Ceci est une solution simple qui peut être utilisée lors de la conversion d’une chaîne en format hexadécimal:

 private static Ssortingng encryptPassword(Ssortingng password) throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(password.getBytes("UTF-8")); return new BigInteger(1, crypt.digest()).toSsortingng(16); } 

Comme mentionné précédemment, utilisez le codec apache commons. Il est également recommandé par les gars de Spring (voir DigestUtils dans Spring doc). Par exemple:

 DigestUtils.sha1Hex(b); 

Certainement ne serait pas utiliser la réponse la mieux notée ici.

Il ne s’imprime pas correctement car vous devez utiliser le codage Base64. Avec Java 8, vous pouvez encoder en utilisant la classe d’encodeur Base64 .

 public static Ssortingng toSHA1(byte[] convertme) { md = MessageDigest.getInstance("SHA-1"); return Base64.getEncoder().encodeToSsortingng((md.digest(convertme)); } 

Résultat

Cela vous donnera la sortie attendue de 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

La raison pour laquelle cela ne fonctionne pas est que lorsque vous appelez Ssortingng(md.digest(convertme)) , vous dites à Java d’interpréter une séquence d’octets chiffrés en tant que chaîne. Ce que vous voulez, c’est convertir les octets en caractères hexadécimaux.

Convertir le tableau d’octets en chaîne hexadécimale.

 public static Ssortingng toSHA1(byte[] convertme) { final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray(); MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-1"); } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } byte[] buf = md.digest(convertme); char[] chars = new char[2 * buf.length]; for (int i = 0; i < buf.length; ++i) { chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4]; chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F]; } return new Ssortingng(chars); } 

Base 64 Représentation du hachage SHA1 :

 Ssortingng hashedVal = Base64.getEncoder().encodeToSsortingng(DigestUtils.sha1(ssortingngValue.getBytes(Charset.forName("UTF-8"))));