MD5 해시를 어떻게 생성 할 수 있습니까?


답변:


602

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

전화 MessageDigest.getInstance("MD5")의 MD5 인스턴스 얻기 위해 MessageDigest당신이 사용할 수 있습니다.

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

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

byte[]의해 반환되는 md.digest()것은 MD5 해시입니다.


144
여기에 언급되지 않은 한 가지는 놀랍습니다. MessageDigest 클래스는 스레드로부터 안전하지 않습니다. 다른 스레드에서 사용하려는 경우 재사용하지 않고 새 스레드를 작성하십시오.
mjuarez

39
내부 상태를 변경하기 위해 여러 방법을 사용합니다. 스레드 안전성 부족이 어떻게 놀랍습니까?
Bombe

90
@Bombe : 왜 우리가 기대해야 해야 MessageDigest 등의 내부 상태에 대해 알고?
Dan Barowy

28
@ DanBarowy, 당신 그것을 변경하고 있습니다 (즉, 값을 반환하지 않지만 다른 방법으로 다른 값을 반환하도록하는 메소드 호출). 그렇지 않으면 입증되지 않을 때까지 항상 스레드 안전하지 않다고 가정해야합니다.
Bombe

3
@Traubenfuchs를 MessageDigest사용하면 데이터를 청크로 입력 할 수 있습니다. 정적 방법으로는 불가능합니다. 모든 데이터를 한 번에 전달할 수있을 때 편의상 하나를 추가해야한다고 주장 할 수 있습니다.
user253751

690

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()하여 결과 해시를 얻습니다.


“LATIN1”! =“ASCII”(또는“US-ASCII”). ASCII는 7 비트 문자 세트이고 Latin1은 8 비트 문자 세트입니다. 그들은 동일하지 않습니다.
Bombe

8

14
이 주제 는 결과 바이트를 16 진 문자열로 변환해야하는 경우에도 유용합니다.
weekens

1
그렇다면 어떻게이 소화를 문자열로 변환하여 mysql에 삽입 할 수 있습니까?
Humphrey

2
더 나은 아직 가능하다면 사용하십시오 yourString.getBytes(StandardCharsets.UTF_8). 이렇게하면을 처리 할 수 ​​없습니다 UnsupportedEncodingException.
Hummeling Engineering BV 2009

267

실제로 바이트 배열이 아닌 문자열로 답을 원한다면 항상 다음과 같이 할 수 있습니다.

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

12
@BalusC : 사실이 아닙니다. BigInteger.toString 메소드는 지정된 밑수로 정수를 리턴합니다. 0x0606은 606으로 인쇄되며 후행 0 만 생략됩니다
Spidey

11
작은 nitpick : getInstance를 호출 한 직후 m.reset ()이 필요하지 않습니다. 더 작은 : '여기에 당신의 텍스트'는 큰 따옴표가 필요합니다.
David Leppik

Java 11부터는 hashtext = "0".repeat(32 - hashtext.length()) + hashtext대신을 사용할 수 while있으므로 편집기에서 루프 내에서 문자열 연결을 수행하고 있다는 경고를 표시하지 않습니다.
tom

m.update (plaintext.getBytes ()) 대신; 인코딩을 지정하는 것이 좋습니다. 예를 들어 m.update (plaintext.getBytes ( "UTF-8")); getBytes ()는 인코딩을 보장하지 않으며 시스템마다 다를 수 있으므로 동일한 문자열의 시스템간에 다른 MD5 결과가 발생할 수 있습니다.
user1819780

256

MD5 또는 SHA 다이제스트를 작성하는 매우 편리한 방법을 제공 하는 Apache Commons 코덱 프로젝트 의 DigestUtils 클래스 를 살펴볼 수도 있습니다 .


2
특히, 바이트 데이터의 "안전한"인코딩 된 표현을 문자열 형태로 반환하는 메소드.
Rob

4
그러나, 많은 라이브러리를 추가하거나 최소한 두 개의 클래스가 더 필요한 "손마다"클래스를 이식하지 않고 DigestUtils 클래스를 프로젝트로 가져 오는 쉬운 방법은 없습니다.
iuiz

maven repos에서도 찾을 수 없습니다. Grrrr.
sparkyspider

5
내가 미친거야하지 않는 한, 중앙 메이븐 저장소에 있어야 :의 groupId = 평민 코덱 artifactId를 = 평민 - 코덱 버전 = 1.5
닉 Spacek

160

이것을 찾았습니다 :

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


15
에서 사용할 인코딩을 지정해야합니다 getBytes(). 그렇지 않으면 코드가 플랫폼 / 사용자 설정에 따라 다른 결과를 얻습니다.
Paŭlo Ebermann

@ PaŭloEbermann은 MessageDigest.getInstance ( "MD5")를 수행합니다. 부족한? 나는 getBytes에서 "MD5"을 () 추가하려고하지만 오류 반환
블레이즈 타마

2
@BlazeTama "MD5"는 인코딩이 아니라 메시지 다이제스트 알고리즘 (새로운 응용 프로그램에서는 사용되지 않아야 함)입니다. 인코딩은 바이트를 문자열로, 문자열을 바이트로 변환하는 알고리즘 쌍입니다. 예를 들어 "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE"등이 있습니다. 이 문자열의 해시를 계산하는 다른 모든 당사자와 동일한 인코딩을 사용하십시오. 그렇지 않으면 다른 결과를 얻을 수 있습니다.
Paŭlo Ebermann

6
문자 집합의 예 (사용 UTF-8입니다 최고의 내 의견에 대부분 호환) ... 들어byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
리처드

내 솔루션이 아니기 때문에 모든 시나리오를 직접 테스트하지 않았으므로 인코딩 등을 지정하는 것이 좋습니다.
dac2009

88

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

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로부터 아파치 코 몬즈 프로젝트 .


14
어쨌든 Apache Commons 코덱을 사용하는 경우 다음을 사용할 수 있습니다. commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle

13
나는 마지막 줄을 이것으로 대체 할 것이다 :String result = Hex.encodeHexString(resultByte);
푸르스름한

84

방금 commons-codec.jar을 다운로드 하고 md5와 같은 완벽한 PHP를 얻었습니다. 여기 수동 입니다.

프로젝트로 가져 와서 사용하십시오.

String Url = "your_url";

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

거기 있습니다.


1
이것은 MySQL 함수 md5 (str)와 동일한 반환 값을 제공하는 방법입니다. 다른 많은 답변이 다른 값을 반환했습니다.
rwitzel

1
Android는 commons-codec 1.2를 번들로 제공하므로 Android에서 제대로 작동하지 않습니다.이 해결 방법은 다음과 같습니다. stackoverflow.com/a/9284092/2413303
EpicPandaForce

76

나는 이것이 가장 명확하고 간결한 방법이라는 것을 알았습니다.

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

3
큰. 선행 0을 자르는 함정에 빠지지 않습니다.
Markus Pscheidt 2016 년

2
API 레벨 <19를 사용하는 경우 Android에서는 작동하지 않지만 md5.update (string.getBytes ( "UTF-8")); 이것은 처리 할 또 하나의 확인 된 예외를 추가 할 것입니다 ...
Fran Marzoa

34

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

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


2
왜이 대답은 -1이고 다른 짧고 설명적인 대답은 +146입니까?
Nilzor

4
BigInteger를 사용하여 16 진수 +1
Dave.B

5
방금 경우에 따라 32 자 길이가 아닌 31 자 길이의 MD5 합계 만 생성한다는 것을
알았습니다.

3
@kovica 이것은 내가 옳은 것을 기억하면 시작 0이 잘 리기 때문입니다. String.format("%032x", new BigInteger(1, hash)); 이것은 이것을 해결해야합니다. 'hash'는 해시의 바이트 []입니다.
Heshan Perera

이 답변에는 문자 세트 유형의 버그가 있습니다!
Dawid Drozd

31

또 다른 옵션은 Guava Hashing 방법 을 사용하는 것입니다 .

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

이미 구아바를 사용하고 있다면 편리합니다.


3
또는 바로 가기 방법 중 하나를 사용 :Hashing.md5().hashString("my string").asBytes();
커트 알프레드 Kluever

4
@KurtAlfredKluever는 'Hashing.md5 (). hashString ( "my string", Charsets.UTF_8) .asBytes ()'와 같은 문자셋을 삽입하는 것을 잊지 마십시오
Justin

31

다른 구현 :

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));

2
외부 라이브러리를 사용하지 않는 한 개의 라이너 만 있습니다.
holmis83

내가 실수하지 않으면 이것은 항상 대문자로 반환되어 16 진수를 사용하지 않고 만든 md5와 일치하지 않습니다. 심지어 정말 확실히 그것은 진정한 MD5입니다
walshie4

2
@ walshie4 16 진수가없는 MD5는 없습니다 ( ietf.org/rfc/rfc1321.txt 참조 ). 소문자로 .toLower ()를 추가하기 만하면됩니다. 예를 들어 en.wikipedia.org/wiki/MD5 의 예제와 결과를 비교하면 Javas 라이브러리 코드가 올바르다 고 믿을 수 있습니다.
스태커

28

일반 텍스트를 해시 형식으로 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


@CedricSimon이 말했듯이, 그것이 바로 내가 찾던 것입니다. 여기에 공감하십시오. 감사합니다!
Joabe Lucena

24

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

DigestUtils.md5Hex(_hash);

또는

DigestUtils.md5(_hash);

어느 쪽이든 당신과 같은 다른 암호화 방법을 사용할 수 있습니다 sha또는 md.


22

내 공개되지 않은 답변 :

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)대문자 형식이합니다
알렉스


17

당신은 다음을 시도 할 수 있습니다. 자세한 내용 및 다운로드 코드는 여기 ( 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();
}
}

16

Bombe의 대답은 정확하지만 MD5를 절대적으로 사용해야하는 경우가 아니라면 (예 : 상호 운용성을 위해 강제로 사용하지 않는 한) MD5가 장기적으로 사용하기에는 약하므로 SHA1이 더 좋습니다.

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


상대적인 장점과 단점에 대해 읽을 수있는 몇 가지 자료를 알려 주시겠습니까?
Akshay

아마도 지금 당장 할 수있는 최선의 방법은 SHA1을 사용하고 나중에 교체 할 준비가 된 것입니다. 새로운 기능을 사용할 수는 있지만 아직 많은 연구가 이루어지지 않았습니다. 온라인 보안 리소스를 추적하여 변경 사항을 확인할 수 있습니다 (예 : Bruce Schneier의 블로그).
frankodwyer

7
SHA1은 암호로 안전한 해시를 원하지 않는 한, 즉 해시가 원본 메시지를 재구성하는 데 도움이되기를 원하지 않거나 영리한 공격자가 해시와 일치하는 다른 메시지를 만들지 않도록하기 위해 과도합니다. 원본이 비밀이 아니며 해시가 보안에 사용되지 않는 경우 MD5가 빠르고 쉽습니다. 예를 들어 Google Web Toolkit은 JavaScript URL에서 MD5 해시를 사용합니다 (예 : foo.js? hash = 12345).
David Leppik

12

다른 구현 : Java에서 빠른 MD5 구현

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

1
이것은 최소한의 의존성을 가진 견고한 독립형 라이브러리입니다. 좋은 물건.
Ajax

나는 그것이 매우 유용하다는 것을 알았습니다. 4.57GB 파일의 경우 15357ms, Java 내장 구현의 경우 19094ms가 소요되었습니다.
bkrish 2016 년

11

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

  • 주어진 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)
        );
}

1
BTW, 내 자신을 제외하고 다른 사람이 내 JRE 지식이 실제로 얼마나 나쁜지를 알기 전에 DigestInputStreamDigestOutputStream을 발견했습니다 . 방금 배운 내용을 반영하여 원래 솔루션을 편집하려고합니다.
kriegaex

6

다음 링크를 살펴보십시오. 예제는 제공된 이미지의 MD5 해시를 얻습니다. 이미지의 MD5 해시


6

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

실제로 MD5 바이트 배열 (크기 == 16) 만 허용합니다. 임의 길이의 바이트 배열을 전달할 수 있습니다. MD5를 통해 MD5 바이트 배열로 변환됩니다 MessageDigest( nameUUIDFromBytes () 소스 코드 참조 )
Lu55

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

6

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이 추가되어 있음을 알 수 있습니다.


5

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


2
파일 무결성이 보안 문제가 아니라고 생각하는 이유는 무엇입니까?
Jeremy Huiskamp

5

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

}

4

이 시도:

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

2
선행 0을 제거하므로 이것은 아마도 최악의 솔루션입니다.
Jannick

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

1
코 틀린 언어인가요?
Isuru

3
@Isuru는 스칼라처럼 보인다
gildor

4

패키지 의 클래스에있는 메소드를 사용하여 주어진 텍스트에 대해 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 해시를 반환합니다.


2

이것이 내가 MD5 해시 문자열을 반환하는 편리한 스칼라 함수를 위해 여기 온 것입니다.

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

0
 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.