Bagaimana saya bisa hash beberapa string dengan sha256
di Jawa? Adakah yang tahu perpustakaan gratis untuk ini?
Bagaimana saya bisa hash beberapa string dengan sha256
di Jawa? Adakah yang tahu perpustakaan gratis untuk ini?
Jawaban:
SHA-256 bukan "encoding" - ini adalah hash satu arah.
Anda pada dasarnya akan mengubah string menjadi byte (misalnya menggunakan text.getBytes(StandardCharsets.UTF_8)
) dan kemudian hash byte. Perhatikan bahwa hasil hash juga akan menjadi data biner yang berubah-ubah, dan jika Anda ingin menyatakan bahwa dalam sebuah string, Anda harus menggunakan base64 atau hex ... jangan mencoba menggunakan String(byte[], String)
konstruktor.
misalnya
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
"UTF-8"
literal di Java 7+: satu pengecualian yang diperiksa lebih sedikit untuk dikhawatirkan.
Saya pikir solusi termudah adalah menggunakan Apache Common Codec :
String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);
Alternatif lain adalah Guava yang memiliki rangkaian utilitas Hashing yang mudah digunakan . Sebagai contoh, untuk hash string menggunakan SHA256 sebagai hex-string, Anda cukup melakukan:
final String hashed = Hashing.sha256()
.hashString("your input", StandardCharsets.UTF_8)
.toString();
Contoh lengkap hash to string sebagai string lain.
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);
}
}
Jika Anda menggunakan Java 8, Anda dapat menyandikan byte[]
dengan melakukan
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
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();
}
}
0xff
? Tidak menghasilkan apa-apa, bukan?
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;
}
Ini adalah pendekatan saya menggunakan 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.fold("", { str, it -> str + "%02x".format(it)})
}
[B@188363e
:, bukan kata sandi yang dienkripsi. Plus, tampaknya berbeda setiap kali fungsi ini dipanggil.
return hash.fold("", { str, it -> str + "%02x".format(it)})
yang mengembalikan kata sandi terenkripsi dan bukan objek itu sendiri.
Berikut adalah cara yang sedikit lebih berkinerja untuk mengubah intisari menjadi string hex:
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);
}
Adakah yang tahu cara yang lebih cepat di Jawa?
Anda dapat menggunakan MessageDigest dengan cara berikut:
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();
}
Di Jawa 8
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import javax.xml.bind.DatatypeConverter;
Scanner scanner = new Scanner(System.in);
String password = scanner.nextLine();
scanner.close();
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] hash = digest.digest(password.getBytes(StandardCharsets.UTF_8));
String encoded = DatatypeConverter.printHexBinary(hash);
System.out.println(encoded.toLowerCase());
Di Jawa, kelas MessageDigest digunakan untuk menghitung nilai hashing kriptografis. Kelas ini menyediakan fungsi hash kriptografis ( MD5 , SHA-1 dan SHA-256 ) untuk menemukan nilai hash teks.
Contoh kode untuk menggunakan algoritma SHA-256.
public void printHash(String str) throws NoSuchAlgorithmException {
MessageDigest md=MessageDigest.getInstance("SHA-256");
byte[] sha256=md.digest(str.getBytes(StandardCharsets.UTF_8));
for(byte b : sha256){
System.out.printf("%02x",b);
}
}
Ini yang saya gunakan untuk hashing:
String pass = "password";
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte hashBytes[] = messageDigest.digest(pass.getBytes(StandardCharsets.UTF_8));
BigInteger noHash = new BigInteger(1, hashBytes);
String hashStr = noHash.toString(16);
Output: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
private static String getMessageDigest(String message, String algorithm) {
MessageDigest digest;
try {
digest = MessageDigest.getInstance(algorithm);
byte data[] = digest.digest(message.getBytes("UTF-8"));
return convertByteArrayToHexString(data);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
Anda dapat memanggil metode di atas dengan algoritma yang berbeda seperti di bawah ini.
getMessageDigest(message, "MD5");
getMessageDigest(message, "SHA-256");
getMessageDigest(message, "SHA-1");
Anda dapat merujuk tautan ini untuk aplikasi lengkap.