Programing

MD5 해시를 생성하려면 어떻게해야합니까?

lottogame 2020. 9. 28. 07:52
반응형

MD5 해시를 생성하려면 어떻게해야합니까?


Java에서 문자열의 MD5 해시를 생성하는 방법이 있습니까?


당신은 필요합니다 java.security.MessageDigest.

사용할 MessageDigest.getInstance("MD5")수있는 MD5 인스턴스를 얻으려면 호출하십시오 MessageDigest.

다음 중 하나를 수행하여 해시를 계산합니다.

  • 전체 입력을 a로 공급 byte[]하고를 사용하여 한 번의 작업으로 해시를 계산합니다 md.digest(bytes).
  • 을 호출 하여 MessageDigest한 번에 하나의 byte[]청크를 공급합니다 md.update(bytes). 입력 바이트 추가를 완료하면 md.digest().

에서 byte[]반환 된 md.digest()것은 MD5 해시입니다.


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()결과 해시를 얻기 위해 호출 하십시오.


실제로 답변을 바이트 배열이 아닌 문자열로 되돌리려면 항상 다음과 같이 할 수 있습니다.

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;
}

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


사용 방법은 다음과 같습니다.

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));

여기서 Hex는 Apache Commons 프로젝트org.apache.commons.codec.binary.Hex 에서 가져온 것 입니다.


방금 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()));

또 다른 옵션은 Guava Hashing 메서드 를 사용하는 것입니다 .

Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();

이미 구아바를 사용하고 있다면 편리합니다 (그렇지 않다면 아마 그럴 것입니다).


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));
    }
}

코드는 여기 에서 추출되었습니다 .


또 다른 구현 :

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");
    }
}

JUnit 및 PHP로 테스트

PHP 스크립트 :

<?php

echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";

출력 PHP 스크립트 :

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

JUnit으로 예제 및 테스트 사용 :

    public class HashTest {

    @Test
    public void test() {
        String txt = "Hello World";
        assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
        assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
    }

}

GitHub의 코드

https://github.com/fitorec/java-hashes


별로 드러나지 않는 대답 :

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;
}

너무 복잡하게 만들 필요가 없습니다. DigestUtils 는 잘 작동하며 md5 해시로 작업하는 동안 편안하게합니다.

DigestUtils.md5Hex(_hash);

또는

DigestUtils.md5(_hash);

sha 또는 md와 같은 다른 암호화 방법을 사용할 수 있습니다.


Bombe의 대답은 맞지만 MD5를 반드시 사용해야하는 경우가 아니면 (예 : 상호 운용성을 위해 강제로) MD5가 장기 사용에 약점이 있으므로 SHA1을 선택하는 것이 더 좋습니다.

SHA1에도 이론적 인 취약점이 있지만 심각하지는 않다는 점을 추가해야합니다. 해싱의 현재 상태는 후보 대체 해시 함수가 많이 있지만 아직 SHA1을 대체하는 표준 모범 사례로 등장하지 않은 것입니다. 따라서 필요에 따라 해시 알고리즘을 구성 가능하게 만들어 향후 교체 할 수 있도록하는 것이 좋습니다.


DigestUtils클래스 도는 :

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

이 클래스에는 md5DigestAsHex()작업을 수행하는 메서드 포함되어 있습니다 .


다음을 시도 할 수 있습니다. 여기에서 세부 사항 및 다운로드 코드를 참조하십시오 : 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();
}
}

또 다른 구현 : Java의 빠른 MD5 구현

String hash = MD5.asHex(MD5.getHash(new File(filename)));

이것이이 글을 읽는 사람과 관련이 있는지는 모르겠지만, 제가 원했던 문제가있었습니다.

  • 주어진 URL에서 파일을 다운로드 하고
  • MD5를 알려진 값과 비교하십시오.

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 Hash of an Image


그만한 가치가있는 이유는 COM 구성 요소를 설치할 프로그램의 자연 키에서 GUID를 합성하고 싶었 기 때문에 우연히 발견했습니다. GUID 수명주기를 관리하지 않도록 통합하고 싶습니다. 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();

MD5는 최상의 보안이 필요하지 않은 경우 완벽하게 괜찮고 파일 무결성 검사와 같은 작업을 수행하는 경우 보안은 고려 사항이 아닙니다. 이러한 경우 Java 라이브러리에서도 지원되는 Adler32와 같은 더 간단하고 빠른 것을 고려할 수 있습니다.


import java.security.*;
import javax.xml.bind.*;

byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytesOfDigest = md.digest(bytesOfMessage);
String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();

이 시도:

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 "";
    }
}

이것은 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;            
    }

}

md5 함수 ie를 호출하여 텍스트의 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);

여기서 해시 텍스트에 0이 추가되어 PHP의 md5 해싱과 일치하는 것을 볼 수 있습니다.


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 해시 문자열을 반환하는 편리한 스칼라 함수를 위해 여기에 온 것입니다.

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}

패키지 클래스에있는 메서드를 사용하여 주어진 텍스트에 대해 MD5 해시생성 할 수 있습니다 . 다음은 전체 코드 스 니펫입니다.MessageDigestjava.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 해시를 반환합니다.


 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

참고 URL : https://stackoverflow.com/questions/415953/how-can-i-generate-an-md5-hash

반응형