Comment hacher une chaîne avec sha256 dans Java? Est-ce que quelqu'un connaît une bibliothèque gratuite pour cela?
SHA-256 n'est pas un "encodage" - c'est un hachage à sens unique.
En gros, vous convertissez la chaîne en octets (par exemple, en utilisant text.getBytes(StandardCharsets.UTF_8)
), puis vous hachez les octets. Notez que le résultat du hachage aussi sera des données binaires arbitraires, et si vous voulez représenter cela dans une chaîne, vous devez utiliser base64 ou hex ... ne pas = essayez d'utiliser le constructeur String(byte[], String)
.
par exemple.
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
Je pense que la solution la plus simple est d’utiliser Apache Common Codec :
String sha256hex = org.Apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);
Une autre alternative est Guava qui propose une suite d’utilitaires hachage facile à utiliser. Par exemple, pour hacher une chaîne en utilisant SHA256 comme chaîne hexagonale, vous feriez simplement:
final String hashed = Hashing.sha256()
.hashString("your input", StandardCharsets.UTF_8)
.toString();
Exemple complet hash to string 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);
}
}
Si vous utilisez Java 8, vous pouvez encoder le byte[]
en faisant
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
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.getEncoder().encodeToString(hashedByetArray);
return encoded;
}
Convertir Java Chaîne en Hash 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();
}
}
J'ai tracé le code Apache via DigestUtils
et sha256
semble revenir par défaut à Java.security.MessageDigest
pour le calcul. Apache n'implémente pas de solution sha256
indépendante. Je recherchais une implémentation indépendante à comparer avec la bibliothèque Java.security
. FYI seulement.
Voici un moyen légèrement plus performant de transformer le résumé en 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);
}
Est-ce que quelqu'un connaît un moyen plus rapide en Java?
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();
}
C'était mon approche en utilisant Kotlin:
private fun getHashFromEmailString(email : String) : String{
val charset = Charsets.UTF_8
val byteArray = email.toByteArray(charset)
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(byteArray)
return hash.toString()
}