Java의 SHA-256을 통한 해시 문자열
인터넷뿐만 아니라 이곳도 둘러보면서 Bouncy Castle을 찾았습니다.Bouncy Castle(또는 기타 자유롭게 사용할 수 있는 유틸리티)을 사용하여 Java에서 SHA-256 Hash of a String을 생성하고 싶습니다.그들의 문서를 보면 내가 하고 싶은 일의 좋은 예를 찾을 수 없을 것 같다.여기 누구 저 좀 도와줄 사람 있나요?
문자열을 해시하려면 내장된 MessageDigest 클래스를 사용합니다.
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);
}
}
위의 토막에서digest
해시된 문자열과hex
에는 왼쪽 제로 패딩의 16진수 ASCII 문자열이 포함되어 있습니다.
이는 런타임 libs에 이미 구현되어 있습니다.
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;
}
JE6+ 환경에서는 JAXB DataTypeConverter를 사용할 수도 있습니다.
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
반드시 BouncyCastle 도서관이 필요한 것은 아닙니다.다음 코드는 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);
}
}
이 투고로부터의 유저 1452273에게 특별한 감사를 표합니다.Java에서 sha256으로 문자열을 해시하려면 어떻게 해야 합니까?
계속 잘해주길!
임의의 jce 프로바이더에서 해시 코드를 사용할 경우 먼저 알고리즘의 인스턴스를 가져오고 해시할 데이터로 업데이트하며 작업이 끝나면 다이제스트를 호출하여 해시 값을 가져옵니다.
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(in.getBytes());
byte[] digest = sha.digest();
다이제스트를 사용하여 필요에 따라 base64 또는 16진 부호화 버전을 얻을 수 있습니다.
Java 8: Base64 사용 가능:
MessageDigest md = MessageDigest.getInstance( "SHA-512" );
md.update( inbytes );
byte[] aMessageDigest = md.digest();
String outEncoded = Base64.getEncoder().encodeToString( aMessageDigest );
return( outEncoded );
당신은 SHA-256이 없는 비교적 오래된 Java 버전을 사용하고 있다고 생각합니다.따라서 Java 버전에서 이미 제공된 '보안 공급자'에 BouncyCastle 공급자를 추가해야 합니다.
// 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();
return new String(Hex.encode(digest));
Java 8 사용
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = DatatypeConverter.printHexBinary(hash);
System.out.println(encoded.toLowerCase());
이것은 "org.bouncycastle.util.encoders"와 연동됩니다.16진수 이하 패키지
return new String(Hex.encode(digest));
바운시캐슬 항아리 안에 있어
언급URL : https://stackoverflow.com/questions/3103652/hash-string-via-sha-256-in-java
'programing' 카테고리의 다른 글
한 테이블에서 모든 레코드를 선택하고 다른 테이블에서 계산된 값을 선택하여 모든 결과를 표시하는 방법 (0) | 2022.10.07 |
---|---|
Linux/CentOS PC의 php.ini 파일은 어디에 있습니까? (0) | 2022.10.07 |
Python을 사용하여 Selenium WebDriver에서 WebElement의 HTML 소스를 가져옵니다. (0) | 2022.10.07 |
zeroDateTimeBehavior=hiberToNull이 휴지 상태를 사용하여 jdbc URL에서 작동하지 않습니다. (0) | 2022.10.07 |
phpmyadmin을 사용하여 데이터베이스를 복제하려면 어떻게 해야 합니까? (0) | 2022.10.07 |