Java에서 sha256으로 문자열을 해시하려면 어떻게 해야 합니까?
스트링을 해시하려면 어떻게 해야 하나요?sha256
자바어?
SHA-256은 "인코딩"이 아니라 단방향 해시입니다.
기본적으로 문자열을 바이트로 변환합니다(예:text.getBytes(StandardCharsets.UTF_8)
바이트를 해시합니다.해시의 결과도 임의의 바이너리 데이터가 됩니다.이 데이터를 문자열로 나타내려면 base64 또는 16진수를 사용해야 합니다.사용하려고 하지 마세요.String(byte[], String)
컨스트럭터
예.
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
가장 쉬운 해결책은 Apache Common Codec을 사용하는 것이라고 생각합니다.
String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);
또 다른 대안은 사용하기 쉬운 Hashing 유틸리티 스위트를 가진 Guava입니다.예를 들어 SHA256을 16진수 문자열로 사용하여 문자열을 해시하려면 다음 절차를 수행합니다.
final String hashed = Hashing.sha256()
.hashString("your input", StandardCharsets.UTF_8)
.toString();
다른 문자열로서의 해시에 대한 완전한 예.
public static String sha256(final String base) {
try{
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
final byte[] hash = digest.digest(base.getBytes("UTF-8"));
final StringBuilder hexString = new StringBuilder();
for (int i = 0; i < hash.length; i++) {
final 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);
}
}
Java 8 을 사용하고 있는 경우는,byte[]
함으로써
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();
}
}
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;
}
아파치 코드를 추적해서DigestUtils
그리고.sha256
디폴트 상태로 되돌아가다java.security.MessageDigest
계산을 위해.Apache는 독립 시스템을 구현하지 않습니다.sha256
솔루션.이 소프트웨어나 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어, 소프트웨어 등java.security
도서관.참고만.
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)})
}
다이제스트를 16진수 문자열로 변환하는 조금 더 뛰어난 방법을 다음에 나타냅니다.
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);
}
자바어로 더 빠른 방법을 아는 사람 있나요?
Java 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());
MessageDigest는 다음과 같은 방법으로 사용할 수 있습니다.
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();
}
해싱에 사용된 것은 다음과 같습니다.
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);
출력: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
Java에서는 MessageDigest 클래스가 암호화 해시 값을 계산하기 위해 사용됩니다.이 클래스는 텍스트의 해시 값을 찾기 위한 암호화 해시 함수(MD5, SHA-1 및 SHA-256)를 제공합니다.
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);
}
}
여기 a를 반환하는 방법이 있습니다.String
:
public static String sha256(final String data) {
try {
final byte[] hash = MessageDigest.getInstance("SHA-256").digest(data.getBytes(StandardCharsets.UTF_8));
final StringBuilder hashStr = new StringBuilder(hash.length);
for (byte hashByte : hash)
hashStr.append(Integer.toHexString(255 & hashByte));
return hashStr.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
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;
}
위와 같은 다른 알고리즘으로 위의 메서드를 호출할 수 있습니다.
getMessageDigest(message, "MD5");
getMessageDigest(message, "SHA-256");
getMessageDigest(message, "SHA-1");
이 링크를 참조하면 완전한 응용 프로그램을 볼 수 있습니다.
언급URL : https://stackoverflow.com/questions/5531455/how-to-hash-some-string-with-sha256-in-java
'programing' 카테고리의 다른 글
서명된 int와 서명되지 않은 int의 차이점은 무엇입니까? (0) | 2022.07.05 |
---|---|
초기 값을 HTML에서 직접 사용할 수 있는 vue.js 모델로 설정합니다. (0) | 2022.07.05 |
어떻게 공짜가 얼마를 공짜로 주는지 알 수 있죠? (0) | 2022.07.05 |
@인터페이스의 메서드 구현을 덮어쓸까요? (0) | 2022.07.05 |
여러 탭을 열 때 Nuxt 브라우저가 충돌합니다. (0) | 2022.07.05 |