programing

Java에서 MD5 해시를 생성하려면 어떻게 해야 하나요?

goodcopy 2022. 8. 8. 16:05
반응형

Java에서 MD5 해시를 생성하려면 어떻게 해야 하나요?

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

MessageDigest클래스에서는 MD5 다이제스트 인스턴스를 제공할 수 있습니다.

문자열 및 암호 클래스를 사용할 때는 반드시 바이트 표현에 사용할 인코딩을 지정해야 합니다.그냥 사용하면string.getBytes()플랫폼의 디폴트를 사용합니다.(모든 플랫폼이 같은 디폴트를 사용하는 것은 아닙니다)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] theMD5digest = md.digest(bytesOfMessage);

는, 「 」를 해 주세요..update(xxx) 콜을 하겠습니다..digest()결과 해시를 가져옵니다.

필요합니다.

MD5 인스턴스를 취득하기 위한 호출MessageDigest사용할 수 있습니다.

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

  • 를 입력 a로 합니다.byte[]를 사용하여 해시를 1회 연산으로 계산합니다.
  • MessageDigestbyte[]를 호출하여 한 번에 청크를 수행합니다.입력 바이트 추가가 완료되면 와의 해시를 계산합니다.

byte[] returned returned returned returned returned returned returned returned returnedmd.digest()MD5 시 md md md md md md

실제로 응답을 바이트 배열이 아닌 문자열로 되돌리는 경우 항상 다음과 같은 작업을 수행할 수 있습니다.

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는 기는 、 헥스이다.org.apache.commons.codec.binary.Hex아파치 커먼즈 프로젝트로부터요

이 방법이 가장 명확하고 간결한 방법임을 알게 되었습니다.

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

방금 commons-codec.jar를 다운로드해서 md5와 같은 완벽한 php를 얻었어요.여기 매뉴얼이 있습니다.

프로젝트로 Import하여 사용하기만 하면 됩니다.

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

그게 다야.

MD5 해시에서 String 표현을 얻을 수 있는 이 솔루션을 찾았습니다.

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

또 다른 옵션은 다음과 같은 Guava 해시 방식을 사용하는 것입니다.

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

이미 Guava를 사용하고 있다면 편리합니다(Guava를 사용하고 있지 않다면, 사용할 필요가 있습니다).

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Digest Utils는 정상적으로 동작하며 작업 시 편안함을 제공합니다.md5해시

DigestUtils.md5Hex(_hash);

또는

DigestUtils.md5(_hash);

외의 으로는, 예를 들면, 「아니다」라고 하는 할 수 있습니다.sha ★★★★★★★★★★★★★★★★★」md.

md5 또는 sha1, simillar that php functions(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수업도 있습니다.

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

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

SHA1도 이론적으로 취약하지만 그렇게 심각하지는 않다고 덧붙여야 합니다.해시에 관한 최신 기술은 많은 후보 대체 해시 함수가 있지만 아직 SHA1을 대체할 표준 모범 사례로 떠오르지 않았다는 것입니다.따라서 필요에 따라 해시 알고리즘을 나중에 교체할 수 있도록 구성할 수 있도록 하는 것이 좋습니다.

또 다른 구현: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)
        );
}
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();

PHP와 달리 md5 함수를 호출하는 것만으로 텍스트를 MD5 해싱할 수 있습니다.md5($text)자바에서는 조금 복잡해졌습니다.저는 보통 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 해시와 일치합니다.

COM 컴포넌트를 인스톨 하는 프로그램의 자연스러운 키로부터 GUID를 합성해, GUID 라이프 사이클을 관리하지 않게 사이즈를 조정하고 싶다고 생각하고 있기 때문에, 우연히 이것을 알게 되었습니다.MD5를 사용한 후 UUID 클래스를 사용하여 문자열을 가져옵니다.(http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439에서 이 문제가 발생합니다).

어떤 경우에도 java.util.UUID는 MD5 바이트에서 멋진 String을 얻을 수 있습니다.

return UUID.nameUUIDFromBytes(md5Bytes).toString();

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

}
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 해시를 반환합니다.

이것을 시험해 보세요.

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

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에서 확인하세요.

시저를 이용해볼 수도 있어

첫 번째 옵션:

byte[] hash =
    new Hash(
        new ImmutableMessageDigest(
            MessageDigest.getInstance("MD5")
        ),
        new PlainText("String to hash...")
    ).asArray();

두 번째 옵션:

byte[] hash =
    new ImmutableMessageDigest(
        MessageDigest.getInstance("MD5")
    ).update(
        new PlainText("String to hash...")
    ).digest();

언급URL : https://stackoverflow.com/questions/415953/how-can-i-generate-an-md5-hash-in-java

반응형