Java String to SHA1

j'essaye de faire une chaîne simple pour sha1 converter en Java et c'est ce que j'ai...

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

Quand je le passe toSHA1("password".getBytes()) , j'obtiens "[�un�ɹ??�%l�3~��."Je sais que c'est probablement un simple correctif d'encodage comme UTF-8, mais quelqu'un pourrait-il me dire ce que je devrais faire pour obtenir ce que je veux qui est"5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"? Ou est-ce que je fais ça complètement mal?

Merci beaucoup!

124
demandé sur Joachim Sauer 2011-02-04 10:22:16

11 réponses

mise à JOUR

Vous pouvez utiliser Apache Commons Codec (version 1.7+) pour faire ce travail à votre place.

DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)

merci à @ Jon Onstott pour cette suggestion.


Ancienne Réponse

Convertissez votre tableau Byte en chaîne Hex. Réel Comment vous indique comment .

return byteArrayToHexString(md.digest(convertme))

et (copié à partir du Réel, Comment)

public static String byteArrayToHexString(byte[] b) {
  String 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 API Codec 1.4 , a cette belle utilité pour enlever toute la douleur. consultez ici

150
répondu Nishant 2017-05-23 12:18:16

C'est ma solution pour convertir une chaîne en sha1. Il fonctionne bien dans mon application Android:

private static String encryptPassword(String password)
{
    String 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 String byteToHex(final byte[] hash)
{
    Formatter formatter = new Formatter();
    for (byte b : hash)
    {
        formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
}
60
répondu petrnohejl 2012-11-23 22:27:08

utilisant classe de hachage de goyaves :

Hashing.sha1().hashString( "password", Charsets.UTF_8 ).toString()
48
répondu Jan Schaefer 2017-08-03 13:24:21

SHA-1 (et tous les autres algorithmes de hachage) retourner des données binaires. Cela signifie que (en Java) ils produisent un byte[] . Ce tableau byte ne pas représente des caractères spécifiques, ce qui signifie que vous ne pouvez pas simplement le transformer en String comme vous l'avez fait.

si vous avez besoin d'un String , alors vous devez formater ce byte[] d'une manière qui peut être représentée comme un String (autrement, juste gardez le byte[] autour).

deux façons courantes de représenter arbitrairement byte[] en tant que caractères imprimables sont BASE64 ou simple hexadécimal Hex-Strings (i.e. représentant chaque byte par deux chiffres hexadécimaux). On dirait que vous essayez de produire une chaîne hexagonale.

il y a aussi un autre piège: si vous voulez obtenir le SHA-1 D'un Java String , alors vous devez convertir ce String en byte[] d'abord (comme l'entrée de SHA-1 est un byte[] ). Si vous utilisez simplement myString.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 vous l'exécutez (par exemple, il pourrait retourner des données différentes basées sur le paramètre langue/locale de votre OS).

une meilleure solution est de spécifier le codage à utiliser pour la conversion String en byte[] comme ceci: myString.getBytes("UTF-8") . Choisir UTF-8 (ou un autre encodage qui peut représenter chaque caractère Unicode) est le choix le plus sûr ici.

26
répondu Joachim Sauer 2011-02-04 07:37:18

utilisez simplement la bibliothèque codec Apache commons. Ils ont une classe d'utilité appelée DigestUtils

Pas besoin d'entrer dans les détails.

26
répondu DaTroop 2011-02-04 08:25:08

c'est une solution simple qui peut être utilisée lors de la conversion d'une chaîne de caractères au format hex:

private static String encryptPassword(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {

    MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    crypt.reset();
    crypt.update(password.getBytes("UTF-8"));

    return new BigInteger(1, crypt.digest()).toString(16);
}
22
répondu Nikita Koksharov 2018-02-16 21:23:18

comme mentionné ci-dessus utilisez apache commons codec. Il est recommandé par les gars de printemps aussi bien (voir DigestUtils dans le Doc de printemps). Par exemple:

DigestUtils.sha1Hex(b);

N'utiliserait certainement pas la réponse la mieux notée ici.

18
répondu kazuar 2014-05-12 20:42:21

ce n'est pas une impression correcte car vous devez utiliser L'encodage Base64. Avec Java 8, Vous pouvez encoder en utilisant la classe d'encodage Base64 .

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

résultat

cela vous donnera votre production attendue de 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

3
répondu Eduardo Dennis 2017-05-16 15:03:26

la raison pour laquelle cela ne fonctionne pas est que lorsque vous appelez String(md.digest(convertme)) , vous dites à Java d'interpréter une séquence d'octets cryptés comme une chaîne de caractères. Ce que vous voulez est de convertir les octets en caractères hexadécimaux.

1
répondu Zarkonnen 2011-02-04 07:31:00

convertissez la chaîne byte en chaîne hex.

public static String 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 String(chars);
}
0
répondu abhihere 2011-11-02 19:29:08

Base 64 représentation de SHA1 Hash:

String hashedVal = Base64.getEncoder().encodeToString(DigestUtils.sha1(stringValue.getBytes(Charset.forName("UTF-8"))));
0
répondu PUG 2018-01-17 22:29:29