it-swarm.com.de

Hash String via SHA-256 in Java

Wenn ich mich hier und im Internet im Allgemeinen umschaue, habe ich Hüpfburg gefunden. Ich möchte Bouncy Castle (oder ein anderes frei verfügbares Dienstprogramm) verwenden, um einen SHA-256-Hash eines Strings in Java zu generieren. Wenn ich mir ihre Dokumentation anschaue, finde ich anscheinend keine guten Beispiele für das, was ich tun möchte. Kann mir hier jemand helfen?

107
knpwrs

Verwenden Sie zum Hashing einer Zeichenfolge die integrierte MessageDigest -Klasse:

import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;
import Java.nio.charset.StandardCharsets;
import Java.math.BigInteger;

public class CryptoHash {
  public static void main(String[] args) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    String text = "Text to hash, cryptographically.";

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

    String hex = String.format("%064x", new BigInteger(1, digest));
    System.out.println(hex);
  }
}

Im obigen Snippet enthält digest die Hash-Zeichenfolge und hex eine hexadezimale ASCII Zeichenfolge mit Linksnull-Auffüllung.

252
Brendan Long

Dies ist bereits in den Laufzeitbibliotheken implementiert.

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

In einer JEE6 + -Umgebung könnte man auch JAXB DataTypeConverter verwenden:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
29
stacker

Sie brauchen nicht unbedingt die BouncyCastle-Bibliothek. Der folgende Code zeigt, wie Sie dies mit der Funktion Integer.toHexString tun

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

Besonderer Dank geht an user1452273 aus diesem Beitrag: Wie man einen String mit sha256 in Java hasht?

Mach weiter so !

16
Whiplash

Wenn Sie Hashcodes mit einem beliebigen JCE-Anbieter verwenden, versuchen Sie zunächst, eine Instanz des Algorithmus abzurufen, und aktualisieren Sie sie dann mit den Daten, die gehasht werden sollen. Wenn Sie fertig sind, rufen Sie digest auf, um den Hashwert abzurufen.

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

sie können den Digest verwenden, um eine Base64- oder hexadezimal codierte Version entsprechend Ihren Anforderungen zu erhalten

8

Java 8: Base64 verfügbar:

    MessageDigest md = MessageDigest.getInstance( "SHA-512" );
    md.update( inbytes );
    byte[] aMessageDigest = md.digest();

    String outEncoded = Base64.getEncoder().encodeToString( aMessageDigest );
    return( outEncoded );
7
Mike Dever

Vermutlich verwenden Sie eine relativ alte Java Version ohne SHA-256. Daher müssen Sie den BouncyCastle-Provider zu den bereits bereitgestellten 'Security Providern' in Ihrem Java) hinzufügen = version.

    // 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();
5
obe6
return new String(Hex.encode(digest));
0
Kay