Comment hacher une chaîne avec sha256 en Java?


Comment hacher une chaîne avec sha256 en Java ? Est-ce que quelqu'un connaît une bibliothèque gratuite pour cela ?

Author: jbx, 2011-04-03

10 answers

SHA-256 n'est pas un "encodage" - c'est un hachage à sens unique.

Vous convertissez essentiellement la chaîne en octets (par exemple en utilisant text.getBytes(StandardCharsets.UTF_8)), puis hachez les octets. À noter que le résultat du hachage serait - aussi être des données binaires arbitraires, et si vous voulez représenter que dans une chaîne, vous devez utiliser base64 ou hex... n'essayez pas d'utiliser le constructeur String(byte[], String).

Par exemple

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
 239
Author: Jon Skeet, 2018-03-12 13:28:10

Je pense que la solution la plus simple est d'utiliser Apache Codec Commun:

String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);   
 128
Author: seba, 2013-07-13 22:02:40

Une autre alternative est Guavaqui a une suite facile à utiliser de Hachage utilitaires. Par exemple, pour hacher une chaîne en utilisant SHA256 comme chaîne hexadécimale, vous feriez simplement:

final String hashed = Hashing.sha256()
        .hashString("your input", StandardCharsets.UTF_8)
        .toString();
 83
Author: Jonathan, 2016-02-02 13:25:47

Exemple Complet de hachage à la chaîne comme une autre chaîne.

public static String sha256(String base) {
    try{
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(base.getBytes("UTF-8"));
        StringBuffer hexString = new StringBuffer();

        for (int i = 0; i < hash.length; i++) {
            String hex = Integer.toHexString(0xff & hash[i]);
            if(hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }

        return hexString.toString();
    } catch(Exception ex){
       throw new RuntimeException(ex);
    }
}
 65
Author: user1452273, 2012-10-20 17:41:12

Si vous utilisez Java 8, vous pouvez encoder la byte[] en faisant

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
 24
Author: Eduardo Dennis, 2017-06-09 21:26:56

Convertir une chaîne Java en hachage Sha-256

import java.security.MessageDigest;

public class CodeSnippets {

 public static String getSha256(String value) {
    try{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(value.getBytes());
        return bytesToHex(md.digest());
    } catch(Exception ex){
        throw new RuntimeException(ex);
    }
 }
 private static String bytesToHex(byte[] bytes) {
    StringBuffer result = new StringBuffer();
    for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
    return result.toString();
 }
}
 6
Author: Chathura Wijesinghe, 2017-01-27 16:29:55

J'ai tracé le code Apache via DigestUtils et sha256 semble par défaut java.security.MessageDigest pour le calcul. Apache n'implémente pas de solution indépendante sha256. Je cherchais une implémentation indépendante pour comparer avec la bibliothèque java.security. À titre d'information seulement.

 4
Author: garyn, 2017-02-26 09:21:31
String hashWith256(String textToHash) {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] byteOfTextToHash = textToHash.getBytes(StandardCharsets.UTF_8);
    byte[] hashedByetArray = digest.digest(byteOfTextToHash);
    String encoded = Base64.encode(hashedByetArray);
    return encoded;
}
 3
Author: Ezd, 2018-03-13 12:32:49

Voici une façon un peu plus performante de transformer le digest en une chaîne hexadécimale:

private static final char[] hexArray = "0123456789abcdef".toCharArray();

public static String getSHA256(String data) {
    StringBuilder sb = new StringBuilder();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(data.getBytes());
        byte[] byteData = md.digest();
        sb.append(bytesToHex(byteData);
    } catch(Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}

private static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return String.valueOf(hexChars);
}

Quelqu'un connaît-il un moyen plus rapide en Java?

 2
Author: andi, 2018-03-31 08:04:04

Vous pouvez utiliser MessageDigest de la manière suivante:

public static String getSHA256(String data){
    StringBuffer sb = new StringBuffer();
    try{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(data.getBytes());
        byte byteData[] = md.digest();

        for (int i = 0; i < byteData.length; i++) {
         sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }
    } catch(Exception e){
        e.printStackTrace();
    }
    return sb.toString();
}
 1
Author: Piyush_Chhabra, 2017-06-08 12:50:52