Nasıl bir MD5 karması oluşturabilirim?


Yanıtlar:


602

Gerek java.security.MessageDigest.

Kullanabileceğiniz MessageDigest.getInstance("MD5")bir MD5 örneği almak için arayın MessageDigest.

Karma işlemlerden birini yaparak hesaplayın:

  • Tüm girdiyi a olarak besleyin ve byte[]ile bir işlemde karmayı hesaplayın md.digest(bytes).
  • Bir şeyi beslemek MessageDigestbyte[]Bir kerede arayarak bir yığınmd.update(bytes) . Girdi bayt eklemeyi bitirdiğinizde, karmayı ile hesaplayın md.digest().

byte[]Tarafından döndürülen md.digest()MD5 karma olduğunu.


144
Burada bahsedilmeyen bir şey beni şaşırttı. MessageDigest sınıfları iş parçacığı için güvenli DEĞİLDİR. Farklı iş parçacıkları tarafından kullanılacaklarsa, yeniden kullanmaya çalışmak yerine yeni bir iş parçacığı oluşturun.
mjuarez

39
Dahili durumunu değiştirmek için birden çok yöntem kullanır. İplik güvenliği eksikliği nasıl şaşırtıcı olabilir?
Bombe

90
@Bombe: MessageDigest'in iç durumunu neden bilmek zorundayız ?
Dan Barowy

28
İyi @DanBarowy, sen edilir onu mutasyona aksi takdirde her zaman evreli değil o bunu üstlenmesi gerektiğini ispat edilene kadar bu kadar (yani değerleri döndürür ancak farklı değerler döndürmek için başka yöntemler neden olmaz yöntemlerini çağırarak).
Bombe

3
@Traubenfuchs MessageDigest, verileri parçalar halinde girmenizi sağlar. Statik bir yöntemle bu mümkün olmazdı. Her ne kadar tüm verileri bir kerede iletebildiğinizde, kolaylık sağlamak için yine de bir tane eklemeleri gerektiğini iddia edebilirsiniz.
user253751

690

MessageDigestSınıf MD5 özeti örneğine sağlayabilir.

Dizelerle ve kripto sınıflarıyla çalışırken , bayt temsilini istediğiniz kodlamayı her zaman belirttiğinizden emin olun . Yalnızca kullanırsanız string.getBytes()platform varsayılanını kullanır. (Tüm platformlar aynı varsayılanları kullanmaz)

import java.security.*;

..

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

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

Çok fazla veri varsa, .update(byte[])tekrar tekrar çağrılabilecek yönteme bir göz atın . Sonra .digest()ortaya çıkan karmayı elde etmek için arayın .


“LATIN1”! = “ASCII” (veya “US-ASCII”). ASCII 7 bitlik karakter kümesidir, Latin1 8 bitlik karakter kümesidir. Aynı değiller.
Bombe

8
( çok daha iyi bir gerekçe ve açıklama için joelonsoftware.com/articles/Unicode.html adresine bakın )
Piskvor binadan

14
Bu konu , sonuçtaki baytları onaltılık dizeye dönüştürmeniz gerektiğinde de yararlıdır.
hafta

1
O zaman u mysql içine eklemek böylece bu thedigest bir dizeye dönüştürmek nasıl?
Humphrey

2
Daha da iyisi, mümkün olan yerlerde kullanın yourString.getBytes(StandardCharsets.UTF_8). Bu, elleçlemeyi önler UnsupportedEncodingException.
Hummeling Engineering BV

267

Cevabı aslında bir bayt dizisinin aksine bir dize olarak istiyorsanız, her zaman böyle bir şey yapabilirsiniz:

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: Doğru değil, BigInteger.toString yöntemi belirtilen tabandaki tam sayıyı döndürür. 0x0606, 606 olarak yazdırılacak, yalnızca sondaki sıfırlar atlanacak,
Spidey

11
Küçük nitpick: m.reset (), getInstance çağrıldıktan hemen sonra gerekli değildir. Daha önemsiz: 'metniniz buraya' çift tırnak işareti gerektirir.
David Leppik

Java 11'den sonra, hashtext = "0".repeat(32 - hashtext.length()) + hashtextbunun yerine kullanabilirsiniz while, böylece editörler bir döngü içinde dize birleştirme yaptığınız konusunda size bir uyarı vermez.
tom

M.update (plaintext.getBytes ()) yerine; Kodlamayı belirtmenizi tavsiye ederim. m.update (plaintext.getBytes ("UTF-8")); getBytes () kodlamayı garanti etmez ve aynı Dize için sistemler arasında farklı MD5 sonuçlarına neden olabilecek sistemden sisteme değişebilir.
user1819780

256

Ayrıca , MD5 veya SHA özetleri oluşturmak için çok uygun yöntemler sağlayan apache commons codec projesinin DigestUtils sınıfına da bakmak isteyebilirsiniz .


2
Özellikle, bayt verilerinin "güvenli" kodlanmış gösterimlerini dize biçiminde döndüren yöntemler.
Rob

4
Ancak DigestUtils sınıfını bir ton libs eklemeden veya en az iki sınıf daha gerektiren "el başına" sınıfı taşımadan projenize dahil etmenin kolay bir yolu yoktur.
iuiz

Maaven depolarında da bulunamıyor. Grrrr.
sparkyspider

5
Delirmediğim sürece merkezi Maven depolarında olmalı: groupId = commons-codec artifactId = commons-codec sürümü = 1.5
Nick Spacek

160

Bunu buldum:

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

aşağıdaki sitede, bunun için hiçbir kredi almak, ama onun işe yarayan bir çözüm! Benim için diğer kod bir sürü düzgün çalışmadı, karma 0s eksik sona erdi. Bu PHP'nin sahip olduğu gibi görünüyor. kaynak: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


15
Kullanılacak kodlamayı belirtmelisiniz getBytes(), aksi takdirde kodunuz farklı platformlarda / kullanıcı ayarlarında farklı sonuçlar alır.
Paŭlo Ebermann

@ PaŭloEbermann MessageDigest.getInstance ("MD5"); yeterli değil? GetBytes () "MD5" eklemek için çalıştı ama bir hata döndürdü
Blaze Tama

2
@BlazeTama "MD5" bir kodlama değildir, bir mesaj özet algoritmasıdır (yeni uygulamalarda kullanılması gereken bir algoritma değildir). Kodlama, baytları dizelere ve dizeleri bayta dönüştüren bir algoritma çiftidir. Bir örnek "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" ve benzerleridir. Bu dizenin karmasını hesaplayan diğer tüm taraflarla aynı kodlamayı kullanın, aksi takdirde farklı sonuçlar elde edersiniz.
Paŭlo Ebermann

6
Karakter setinin bir örneği için ... (benim görüşüme göre en iyi ve en uyumlu olan UTF-8 kullanın) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard

Bu benim çözümüm olmadığından ve tüm senaryoları kendim test etmediğimden, kodlamayı vb. Belirtmek muhtemelen iyi bir fikir olsa da, değişmeden bırakacağım.
dac2009

88

İşte nasıl kullanacağım:

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 nerede: org.apache.commons.codec.binary.Hexden Apache Commons projesi .


14
Yine de Apache Commons Codec kullanıyorsanız şunları kullanabilirsiniz: commons.apache.org/codec/api-release/org/apache/commons/codec/…
ciyaklama

13
Son satırı bununla değiştirirdim:String result = Hex.encodeHexString(resultByte);
mavimsi

84

Ben sadece commons-codec.jar indirdim ve md5 gibi mükemmel bir php aldım. İşte kılavuz .

Sadece projenize aktarın ve kullanın

String Url = "your_url";

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

İşte buyur.


1
Bu, md5 (str) MySQL işleviyle aynı dönüş değerini sağlayan yöntemdir. Diğer cevapların çoğu başka değerler verdi.
rwitzel

1
Android'de bu işe yaramıyor çünkü Android, bu geçici
çözüme

76

Bunu yapmanın en açık ve özlü yolu olarak buldum:

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

3
Harika. Baştaki sıfırları kesme tuzağına düşmez.
Markus Pscheidt

2
API düzeyi <19 kullanıyorsanız, bunun Android için işe yaramayacağına dikkat edin, ancak md5.update (string.getBytes ("UTF-8")) ile ikinci satırı değiştirmeniz yeterlidir; Bu yine de ele almak için başka bir kontrol edilmiş istisna ekleyecektir ...
Fran Marzoa

34

Bir dize temsilinin bir MD5 karma değerinden geri alınması açısından çok daha temiz olan bu çözümü buldum.

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

Kod buradan çıkarıldı .


2
Bu cevap neden -1, diğer daha kısa ve daha az açıklayıcı cevap +146'ya sahip?
Nilzor

4
BigInteger kullanarak onaltılık değer +1 elde etmek için güzel
Dave.B

5
Ben sadece bazı durumlarda bu sadece olması gerektiği gibi 32 değil, 31 karakter uzunluğunda MD5 toplamı
üretti öğrendim

3
@kovica bunun nedeni, eğer doğru hatırlıyorsam, başlangıç ​​sıfırları kısaltılır .. String.format("%032x", new BigInteger(1, hash)); Bu çözmelidir. 'karma' karma'nın baytı [] 'dır.
Heshan Perera

Bu cevap karakter tipi hata var!
Dawid Drozd

31

Başka bir seçenek Guava Hashing yöntemlerini kullanmaktır :

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

Zaten Guava kullanıyorsanız kullanışlı (eğer değilseniz, muhtemelen olmalı).


3
veya kısayol yöntemlerinden birini kullanarak:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever

4
@KurtAlfredKluever 'Hashing.md5 (). HashString ("dizem", Charsets.UTF_8) .asBytes ()' gibi karakter setini eklemeyi unutmayın
Justin

31

Başka bir uygulama:

import javax.xml.bind.DatatypeConverter;

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

2
Harici bir kütüphane kullanmadığını gördüğüm sadece bir astar.
holmis83

Yanılmıyorsam, bu her zaman hex kullanmadan yapılan md5'lerle hizalanmayacak büyük harfle döner. Değil gerçekten emin o olduğunu bir gerçek md5
walshie4

2
@ walshie4 hex içermeyen bir MD5 yoktur (bkz. ietf.org/rfc/rfc1321.txt ), küçük harfle almak için sadece .toLower () ekleyin. Sonuçları örneğin en.wikipedia.org/wiki/MD5'teki örneklerle karşılaştırın, ardından Javas kütüphane kodunun doğru olduğuna inanma şansınız daha yüksek olacaktır.
istifleyici

28

Md5 veya sha1, php fonksiyonları ( md5 , sha1 ) benzerler biçiminde düz metin dönüştürmek için bir sınıf (karma ) var:

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 ve PHP ile test etme

PHP Betiği:

<?php

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

PHP betiği çıktısı:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Örnek kullanma ve JUnit ile Test Etme:

    public class HashTest {

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

}

GitHub'daki kod

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


@CedricSimon'un dediği gibi, tam da aradığım şey buydu. Burada oy verin .. Teşekkürler!
Joabe Lucena

24

Çok karmaşık hale getirmeye gerek yok.
DigestUtils iyi çalışıyor ve hashlerle çalışırken sizi rahat ettiriyormd5 .

DigestUtils.md5Hex(_hash);

veya

DigestUtils.md5(_hash);

Ya da shaveya gibi diğer şifreleme yöntemlerini kullanabilirsiniz md.


22

Çok açıklayıcı olmayan cevabım:

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

ve String.format("%1$032X", big)büyük harf biçimine sahip
alex


17

Takip etmeyi deneyebilirsiniz. Ayrıntılar ve kodları buradan indirebilirsiniz: 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'nin cevabı doğrudur, ancak kesinlikle MD5 kullanmanız gerekmediği sürece (örn. Birlikte çalışabilirlik için size zorlanana kadar), MD5'in uzun süreli kullanım için zayıflıkları olduğu için daha iyi bir seçim SHA1'dir.

SHA1'in de teorik güvenlik açıklarına sahip olduğunu, ancak o kadar şiddetli olmadığını da eklemeliyim. Karma teknikte mevcut durum, bir dizi aday değiştirme karma fonksiyonunun mevcut olmasıdır, ancak SHA1'in yerini almak için henüz standart en iyi uygulama olarak hiçbiri ortaya çıkmamıştır. Bu nedenle, ihtiyaçlarınıza bağlı olarak, karma algoritmanızı gelecekte değiştirilebilecek şekilde yapılandırmanız önerilir.


Beni, her birinin göreli değerleri ve zayıf yönleri hakkında okuyabileceğim bazı kaynaklara işaret edebilir misiniz?
Akshay

Muhtemelen şu anda yapabileceğiniz en iyi şey SHA1 kullanmak ve gelecekte değiştirmeye hazır olmaktır. Daha yeni işlevleri kullanabilirsiniz, ancak bunlar henüz büyük miktarda araştırmaya tabi tutulmamıştır. Bunun ne zaman değiştiğini öğrenmek için çevrimiçi güvenlik kaynaklarını takip edebilirsiniz - örneğin Bruce Schneier'in blogu.
frankodwyer

7
Kriptografik olarak güvenli bir karma istemediğiniz sürece SHA1 aşırıya kaçar, yani karma'nın orijinal iletiyi yeniden yapılandırmasına yardımcı olmasını veya akıllı bir saldırganın karma ile eşleşen başka bir ileti oluşturmasını istemezsiniz. Orijinal bir sır değilse ve karma güvenlik için kullanılmıyorsa, MD5 hızlı ve kolaydır. Örneğin, Google Web Araç Seti, JavaScript URL'lerinde MD5 karmalarını kullanır (örn. Foo.js? Hash = 12345).
David Leppik

12

Başka bir uygulama: Java'da Hızlı MD5 Uygulaması

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

1
Bu, minimal bağımlılığa sahip sağlam, bağımsız bir kütüphanedir. İyi şeyler.
Ajax

Bunu çok kullanışlı buldum. Java dahili uygulaması 19094 ms aldı iken 4.57 GB dosya için 15357 ms aldı.
bkrish

11

Bunun bunu okuyan herkes için uygun olup olmadığını bilmiyorum, ama sadece istediğim problemi yaşadım

  • verilen bir URL'den bir dosya indirin ve
  • MD5'ini bilinen bir değerle karşılaştırın.

Bunu sadece JRE sınıflarıyla yapmak istedim (Apache Commons veya benzeri yok). Hızlı bir web araması bana her ikisini de aynı anda yapan örnek kod parçacıklarını göstermedi , sadece her görevi ayrı ayrı yaptı. Bu aynı dosyayı iki kez okumayı gerektirdiğinden, dosyayı indirirken anında sağlama toplamı hesaplanarak her iki görevi birleştiren bir kod yazmanın zaman ayırmaya değer olabileceğini düşündüm. Bu benim sonucum (mükemmel Java değilse üzgünüm, ama sanırım yine de fikir olsun):

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
Oh BTW, kendim dışındaki herkes JRE bilgimin gerçekten ne kadar kötü olduğunu fark etmeden önce: DigestInputStream ve DigestOutputStream'i keşfettim . Yeni öğrendiklerimi yansıtacak şekilde orijinal çözümümü düzenleyeceğim.
kriegaex

6

Aşağıdaki bağlantıya bir göz atın, Örnek verilen bir görüntünün MD5 Karmasını alır: Görüntünün MD5 Karması


6

Değeri için, bunun üzerine tökezledim çünkü COM bileşenlerini yükleyecek bir program için doğal bir anahtardan GUID'leri sentezlemek istiyorum; GUID yaşam döngüsünü yönetmeyecek şekilde sentezlemek istiyorum. MD5 kullanacağım ve sonra bir dize almak için UUID sınıfını kullanacağım. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 bu sorunu gündeme getiriyor).

Her durumda, java.util.UUID size MD5 baytlarından güzel bir String sağlayabilir.

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

aslında sadece MD5 bayt dizisini kabul etmez (size == 16). Herhangi bir uzunlukta bayt dizisi iletebilirsiniz. MD5 aracılığıyla MD5 bayt dizisine dönüştürülecektir MessageDigest(bkz. NameUUIDFromBytes () kaynak kodu )
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

Sadece md5 işlevini çağırarak metninizin bir MD5 karma yapabileceğiniz PHP'nin aksine md5($text), Java'da biraz karmaşık hale getirilmiştir. Genellikle md5 karma metnini döndüren bir işlevi çağırarak uyguladım. İşte nasıl uyguladığım, Önce md5hashingana sınıfınızın içinde aşağıda verilen şekilde bir işlev oluşturun .

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

Şimdi, aşağıda belirtildiği gibi ihtiyaç duyduğunuzda işlevi çağırın.

String text = textFieldName.getText();
String pass = md5hashing(text);

Burada PHP'de md5 hashing ile eşleşmesi için hashtext'in sıfır ile eklendiğini görebilirsiniz.


5

En iyi güvenliğe ihtiyacınız yoksa MD5 mükemmel durumdadır ve dosya bütünlüğünü kontrol etmek gibi bir şey yapıyorsanız, güvenlik dikkate alınmaz. Böyle bir durumda, Java kitaplıkları tarafından da desteklenen Adler32 gibi daha basit ve daha hızlı bir şey düşünmek isteyebilirsiniz.


2
Dosya bütünlüğünün bir güvenlik sorunu olmadığını düşündüren nedir?
Jeremy Huiskamp

5

mysql'in md5 işlevinden veya php'nin md5 işlevlerinden vb. aldığınız gibi bu tam md5'i verir. Bu benim kullandığım (ihtiyaçlarınıza göre değiştirebilirsiniz)

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

bunu dene:

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
Baştaki sıfırları kaldırdığı için bu muhtemelen en kötü çözümdür.
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
Bu Kotlin dili mi?
Isuru

3
@Isuru Scala gibi görünüyor
gildor

4

Sen edebilirsiniz MD5 hash oluşturmak içinde yöntemlerden yararlanarak belirli bir metin için MessageDigestsınıf java.securitypaketinde. Kod snippet'inin tamamı aşağıdadır,

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 işlevinden çıkış, 32 onaltılı sayı ile temsil edilen 128 bitlik bir karedir.

MySQL gibi bir veritabanı kullanıyorsanız, bunu daha basit bir şekilde de yapabilirsiniz. Sorgu Select MD5(“text here”), parantez içindeki metnin MD5 karmasını döndürür.


2

Ben buraya geldim - MD5 karma dizesini döndüren kullanışlı bir scala işlevi:

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

Bu konuda Codingkit'te bir makale var. Kontrol edin: http://codingkit.com/a/JAVA/2013/1020/2216.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.