Java에서 문자열의 MD5 해시를 생성하는 방법이 있습니까?
Java에서 문자열의 MD5 해시를 생성하는 방법이 있습니까?
답변:
당신은 필요합니다 java.security.MessageDigest
.
전화 MessageDigest.getInstance("MD5")
의 MD5 인스턴스 얻기 위해 MessageDigest
당신이 사용할 수 있습니다.
다음 중 하나를 수행하여 해시를 계산합니다.
byte[]
로 한 번의 작업으로 해시를 계산하십시오 md.digest(bytes)
.MessageDigest
한 번에 한 byte[]
청크를 공급하십시오 md.update(bytes)
. 입력 바이트 추가가 끝나면로 해시를 계산하십시오
md.digest()
.에 byte[]
의해 반환되는 md.digest()
것은 MD5 해시입니다.
MessageDigest
사용하면 데이터를 청크로 입력 할 수 있습니다. 정적 방법으로는 불가능합니다. 모든 데이터를 한 번에 전달할 수있을 때 편의상 하나를 추가해야한다고 주장 할 수 있습니다.
이 MessageDigest
클래스는 MD5 다이제스트 인스턴스를 제공 할 수 있습니다.
문자열 및 암호화 클래스로 작업 할 때는 항상 바이트 표현을 원하는 인코딩을 지정해야합니다. 방금 사용 string.getBytes()
하는 경우 플랫폼 기본값이 사용됩니다. (모든 플랫폼이 동일한 기본값을 사용하는 것은 아닙니다)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
데이터 .update(byte[])
가 많으면 반복해서 호출 할 수있는 메소드를 살펴보십시오 . 그런 다음 호출 .digest()
하여 결과 해시를 얻습니다.
yourString.getBytes(StandardCharsets.UTF_8)
. 이렇게하면을 처리 할 수 없습니다 UnsupportedEncodingException
.
실제로 바이트 배열이 아닌 문자열로 답을 원한다면 항상 다음과 같이 할 수 있습니다.
String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
대신을 사용할 수 while
있으므로 편집기에서 루프 내에서 문자열 연결을 수행하고 있다는 경고를 표시하지 않습니다.
MD5 또는 SHA 다이제스트를 작성하는 매우 편리한 방법을 제공 하는 Apache Commons 코덱 프로젝트 의 DigestUtils 클래스 를 살펴볼 수도 있습니다 .
이것을 찾았습니다 :
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
아래 사이트에서 나는 그것을 인정하지 않지만 그 해결책은 효과적입니다! 나에게 많은 다른 코드가 제대로 작동하지 않아서 해시에서 0이 누락되었습니다. 이것은 PHP와 같은 것으로 보입니다. 출처 : http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
getBytes()
. 그렇지 않으면 코드가 플랫폼 / 사용자 설정에 따라 다른 결과를 얻습니다.
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
사용 방법은 다음과 같습니다.
final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));
진수는 여기서 org.apache.commons.codec.binary.Hex
로부터 아파치 코 몬즈 프로젝트 .
String result = Hex.encodeHexString(resultByte);
방금 commons-codec.jar을 다운로드 하고 md5와 같은 완벽한 PHP를 얻었습니다. 여기 수동 입니다.
프로젝트로 가져 와서 사용하십시오.
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
거기 있습니다.
나는 이것이 가장 명확하고 간결한 방법이라는 것을 알았습니다.
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
MD5 해시에서 문자열 표현을 다시 얻는 측면에서 훨씬 깨끗한이 솔루션을 찾았습니다.
import java.security.*;
import java.math.*;
public class MD5 {
public static void main(String args[]) throws Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());
System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
}
}
코드는 여기 에서 추출되었습니다 .
String.format("%032x", new BigInteger(1, hash));
이것은 이것을 해결해야합니다. 'hash'는 해시의 바이트 []입니다.
또 다른 옵션은 Guava Hashing 방법 을 사용하는 것입니다 .
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
이미 구아바를 사용하고 있다면 편리합니다.
Hashing.md5().hashString("my string").asBytes();
다른 구현 :
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
일반 텍스트를 해시 형식으로 md5 또는 sha1 형식으로 변환하는 클래스 (해시)가 있습니다. php 함수 ( md5 , sha1 ) 와 비슷 합니다.
public class Hash {
/**
*
* @param txt, text in plain format
* @param hashType MD5 OR SHA1
* @return hash in hashType
*/
public static String getHash(String txt, String hashType) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);
byte[] array = md.digest(txt.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
//error action
}
return null;
}
public static String md5(String txt) {
return Hash.getHash(txt, "MD5");
}
public static String sha1(String txt) {
return Hash.getHash(txt, "SHA1");
}
}
<?php
echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";
MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest {
@Test
public void test() {
String txt = "Hello World";
assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
}
}
너무 복잡하게 만들 필요가 없습니다.
DigestUtils 는 잘 작동하며 md5
해시로 작업하는 동안 편안 합니다.
DigestUtils.md5Hex(_hash);
또는
DigestUtils.md5(_hash);
어느 쪽이든 당신과 같은 다른 암호화 방법을 사용할 수 있습니다 sha
또는 md
.
내 공개되지 않은 답변 :
private String md5(String s) {
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(s.getBytes(), 0, s.length());
BigInteger i = new BigInteger(1,m.digest());
return String.format("%1$032x", i);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
String.format("%1$032X", big)
대문자 형식이합니다
당신은 다음을 시도 할 수 있습니다. 자세한 내용 및 다운로드 코드는 여기 ( http://jkssweetlife.com/java-hashgenerator-md5-sha-1/)를 참조하십시오.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static void main(String[] args) throws Exception {
final String inputString = "Hello MD5";
System.out.println("MD5 hex for '" + inputString + "' :");
System.out.println(getMD5Hex(inputString));
}
public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(inputString.getBytes());
byte[] digest = md.digest();
return convertByteToHex(digest);
}
private static String convertByteToHex(byte[] byteData) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
Bombe의 대답은 정확하지만 MD5를 절대적으로 사용해야하는 경우가 아니라면 (예 : 상호 운용성을 위해 강제로 사용하지 않는 한) MD5가 장기적으로 사용하기에는 약하므로 SHA1이 더 좋습니다.
SHA1에도 이론적 인 취약점이 있지만 심각하지는 않다고 덧붙여 야합니다. 해싱 분야의 최신 기술은 다수의 후보 대체 해시 함수가 있지만 SHA1을 대체하는 표준 모범 사례로는 아직 나타나지 않았다는 것입니다. 따라서 필요에 따라 해시 알고리즘을 구성하여 나중에 교체 할 수 있도록하는 것이 좋습니다.
다른 구현 : Java에서 빠른 MD5 구현
String hash = MD5.asHex(MD5.getHash(new File(filename)));
나는 이것이 이것을 읽는 사람과 관련이 있는지 모르겠지만, 나는 단지 내가 원했던 문제가 있었다.
JRE 클래스로만하고 싶었습니다 (Apache Commons 또는 이와 유사한 것 없음). 빠른 웹 검색으로 샘플 코드 스 니펫이 동시에 두 작업을 동시에 수행하지 않고 각 작업 만 개별적으로 표시했습니다. 이것은 동일한 파일을 두 번 읽어야하기 때문에 파일을 다운로드하는 동안 즉시 체크섬을 계산하여 두 작업을 통합하는 코드를 작성하는 것이 가치가 있다고 생각했습니다. 이것은 내 결과입니다 (완벽한 Java가 아니라면 죄송하지만 어쨌든 아이디어를 얻은 것 같습니다).
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream; // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
void downloadFile(String fromURL, String toFile, BigInteger md5)
throws IOException, NoSuchAlgorithmException
{
ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
MessageDigest md5Digest = MessageDigest.getInstance("MD5");
WritableByteChannel out = Channels.newChannel(
//new FileOutputStream(toFile)); // old
new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB
while (in.read(buffer) != -1) {
buffer.flip();
//md5Digest.update(buffer.asReadOnlyBuffer()); // old
out.write(buffer);
buffer.clear();
}
BigInteger md5Actual = new BigInteger(1, md5Digest.digest());
if (! md5Actual.equals(md5))
throw new RuntimeException(
"MD5 mismatch for file " + toFile +
": expected " + md5.toString(16) +
", got " + md5Actual.toString(16)
);
}
다음 링크를 살펴보십시오. 예제는 제공된 이미지의 MD5 해시를 얻습니다. 이미지의 MD5 해시
COM 구성 요소를 설치하는 프로그램의 기본 키에서 GUID를 합성하고 싶기 때문에 가치가있는 것으로 생각했습니다. GUID 수명주기를 관리하지 않도록 syhthesize하고 싶습니다. MD5를 사용한 다음 UUID 클래스를 사용하여 문자열을 가져옵니다. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439에서이 문제가 발생합니다).
어쨌든 java.util.UUID는 MD5 바이트에서 멋진 문자열을 얻을 수 있습니다.
return UUID.nameUUIDFromBytes(md5Bytes).toString();
MessageDigest
( nameUUIDFromBytes () 소스 코드 참조 )
md5 함수를 호출하여 텍스트의 MD5 해싱을 수행 할 수있는 PHP와 달리 md5($text)
, 즉 Java에서는 약간 복잡해졌습니다. 나는 보통 md5 해시 텍스트를 반환하는 함수를 호출하여 구현했습니다. 구현 방법은 다음과 같습니다. 먼저 md5hashing
기본 클래스 내부에 이름이 지정된 함수를 만듭니다 .
public static String md5hashing(String text)
{ String hashtext = null;
try
{
String plaintext = text;
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
} catch (Exception e1)
{
// TODO: handle exception
JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());
}
return hashtext;
}
이제 아래 주어진대로 필요할 때마다 함수를 호출하십시오.
String text = textFieldName.getText();
String pass = md5hashing(text);
여기에서 PHP의 md5 해싱과 일치하도록 해시 텍스트에 0이 추가되어 있음을 알 수 있습니다.
MD5는 최상의 보안이 필요하지 않으면 완벽하게 작동하며 파일 무결성 검사와 같은 작업을 수행하는 경우 보안을 고려하지 않습니다. 이러한 경우에는 Java 라이브러리에서도 지원되는 Adler32와 같이 더 단순하고 빠른 것을 고려할 수 있습니다.
이것은 mysql의 md5 함수 또는 php의 md5 함수 등에서 얻을 때 정확한 md5를 제공합니다. 이것은 내가 사용하는 것입니다 (필요에 따라 변경 가능)
public static String md5( String input ) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(input.getBytes( "UTF-8" ));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append( String.format( "%02x", array[i]));
}
return sb.toString();
} catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
return null;
}
}
이 시도:
public static String getHashMD5(String string) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
return bi.toString(16);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(MD5Utils.class
.getName()).log(Level.SEVERE, null, ex);
return "";
}
}
import java.security.MessageDigest
val digest = MessageDigest.getInstance("MD5")
//Quick MD5 of text
val text = "MD5 this text!"
val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString
//MD5 of text with updates
digest.update("MD5 ".getBytes())
digest.update("this ".getBytes())
digest.update("text!".getBytes())
val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString
//Output
println(md5hash1 + " should be the same as " + md5hash2)
패키지 의 클래스에있는 메소드를 사용하여 주어진 텍스트에 대해 MD5 해시 를 생성 할 수 있습니다 . 아래는 전체 코드 스 니펫입니다.MessageDigest
java.security
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class MD5HashGenerator
{
public static void main(String args[]) throws NoSuchAlgorithmException
{
String stringToHash = "MyJavaCode";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(stringToHash.getBytes());
byte[] digiest = messageDigest.digest();
String hashedOutput = DatatypeConverter.printHexBinary(digiest);
System.out.println(hashedOutput);
}
}
MD5 함수의 출력은 32 개의 16 진수로 표시되는 128 비트 해시입니다.
MySQL과 같은 데이터베이스를 사용하는 경우 더 간단한 방법으로이 작업을 수행 할 수 있습니다. 쿼리 Select MD5(“text here”)
는 괄호 안에있는 텍스트의 MD5 해시를 반환합니다.
이것이 내가 MD5 해시 문자열을 반환하는 편리한 스칼라 함수를 위해 여기 온 것입니다.
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5 encryption
*
* @author Hongten
*
*/
public class MD5 {
public static void main(String[] args) {
System.out.println(MD5.getMD5("123456"));
}
/**
* Use md5 encoded code value
*
* @param sInput
* clearly
* @ return md5 encrypted password
*/
public static String getMD5(String sInput) {
String algorithm = "";
if (sInput == null) {
return "null";
}
try {
algorithm = System.getProperty("MD5.algorithm", "MD5");
} catch (SecurityException se) {
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte buffer[] = sInput.getBytes();
for (int count = 0; count < sInput.length(); count++) {
md.update(buffer, 0, count);
}
byte bDigest[] = md.digest();
BigInteger bi = new BigInteger(bDigest);
return (bi.toString(16));
}
}
Codingkit에 대한 기사가 있습니다. 체크 아웃 : http://codingkit.com/a/JAVA/2013/1020/2216.html