119 votes

Chaîne de hachage via SHA-256 en Java

En cherchant dans les environs et sur Internet en général, j'ai découvert Bouncy Castle . Je souhaite utiliser Bouncy Castle (ou un autre utilitaire disponible gratuitement) pour générer un hachage SHA-256 d'une chaîne en Java. En regardant leur documentation, je n'arrive pas à trouver de bons exemples de ce que je veux faire. Quelqu'un peut-il m'aider ici?

277voto

Brendan Long Points 24372

Si tout ce que vous voulez faire est de hacher une chaîne, je n’utiliserais que la classe MessageDigest intégrée .

 MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";

md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
 

Tada, digest contient maintenant le hachage de votre chaîne.

31voto

stacker Points 34209

Ceci est déjà implémenté dans les bibliothèques d'exécution.

 public static String calc(InputStream is) {
    String output;
    int read;
    byte[] buffer = new byte[8192];

    try {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        while ((read = is.read(buffer)) > 0) {
            digest.update(buffer, 0, read);
        }
        byte[] hash = digest.digest();
        BigInteger bigInt = new BigInteger(1, hash);
        output = bigInt.toString(16);
        while ( output.length() < 32 ) {
            output = "0"+output;
        }
    } 
    catch (Exception e) {
        e.printStackTrace(System.err);
        return null;
    }

    return output;
}
 

16voto

EliteRunner Points 5

Vous n'avez pas nécessairement besoin de la bibliothèque BouncyCastle. Le code suivant montre comment procéder ainsi à l'aide de la fonction Integer.toHexString

     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);
    }
}
 

Un merci spécial à l'utilisateur1452273 de ce post: Comment encoder une chaîne avec sha256 en Java?

Continuez votre bon travail!

9voto

Nikolaus Gradwohl Points 8296

Lorsque vous utilisez des codes de hachage avec n’importe quel fournisseur jce, essayez d’abord d’obtenir une instance de l’algorithme, puis mettez-le à jour avec les données que vous voulez hacher et, une fois que vous avez terminé, appelez digest pour obtenir la valeur de hachage.

 MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(in.getBytes());
byte[] digest = sha.digest();
 

vous pouvez utiliser le résumé pour obtenir une version encodée en base64 ou hexadécimal selon vos besoins

5voto

obe6 Points 961

Je suppose que vous utilisez une version Java relativement ancienne sans SHA-256. Vous devez donc ajouter le fournisseur BouncyCastle aux «fournisseurs de sécurité» déjà fournis dans votre version Java.

     // NEEDED if you are using a Java version without SHA-256    
    Security.addProvider(new BouncyCastleProvider());

    // then go as usual 
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    String text = "my string...";
    md.update(text.getBytes("UTF-8")); // or UTF-16 if needed
    byte[] digest = md.digest();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X