Java'da herhangi bir dosya için MD5 sağlama toplamı nasıl alınır? Apache Common'ın DigestUtils.md5Hex yardımcı programı nasıl kullanılır?
Yayınlanan: 2021-08-28
Kurumsal uygulamanızın güvenliğini sıkın, herhangi bir organizasyonun en büyük zorluğudur.
Bu gerçek üretim senaryosunu düşünün:
-
reads the value
bir uygulamanız var - Dosya değerine bağlı olarak ekleme/silme/yürütme gibi
performs some operations
gerçekleştirir. - Bu uygulamayı üretim ortamında dağıttınız
- Ya
unauthorized person
sizin bilginiz dışında o dosyanınchanges the value
? - Uygulamanız bir dosyadan
simply gets new value
veunexpected outcome
neden olabilecek mantığı çalıştırır. - Bu dosya için MD5 sağlama toplamını etkinleştirmişseniz, açık hata mesajıyla
could have created an exception
oluşturmuş veyou could have prevented disaster
MD5 sağlama toplamı nedir?
Bir dosyanın MD5 sağlama toplamı, dosyanın parmak izi gibi bir şey olan 128-bit value
. Hem dosyaları karşılaştırmak hem de bütünlük kontrolleri için faydalı olabilir.
Farklı dosya için aynı değeri elde etmek neredeyse imkansızdır. Bu öğreticide, belirli bir dosya için MD5 değerleri oluşturan ve döndüren basit bir Java programı oluşturacağız. Bizim durumumuzda bu index.php
dosyasıdır.
Başlayalım:
Aşama 1
Ortak sınıf CrunchifyGetMD5ForFile.java
oluşturun
Adım 2
Aşağıdaki iki maven bağımlılığını projenizin pom.xml
dosyasına aktarın. Projeyi maven projesine dönüştürmek için öğretici.
1 2 3 4 5 6 7 8 9 10 |
< dependency > < groupId > commons - codec < / groupId > < artifactId > commons - codec < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > |
commons-codec
ve commons-io
kitaplıkları kullanıyoruz.
Aşama 3
DigestUtils.md5Hex
yardımcı programını kullanarak MD5 sağlama toplamı oluşturun ve sonucu konsolda yazdırın.
DigestUtils.md5Hex => encodeHex Uygulaması
1 2 3 4 5 6 7 8 9 10 |
protected static char [ ] encodeHex ( final byte [ ] data , final char [ ] toDigits ) { final int l = data . length ; final char [ ] out = new char [ l < < 1 ] ; // two characters form the hex value. for ( int i = 0 , j = 0 ; i < l ; i ++ ) { out [ j ++ ] = toDigits [ ( 0xF0 & data[i]) >>> 4]; out [ j ++ ] = toDigits [ 0x0F & data[i]]; } return out ; } |
İşte tam bir program.
sınıf crunchifyGetMd5ForFile.java oluşturun
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
package crunchify . com . tutorials ; import org . apache . commons . codec . digest . DigestUtils ; import org . apache . commons . io . IOUtils ; import java . io . File ; import java . io . FileInputStream ; import java . io . IOException ; /** * @author Crunchify.com * How to get MD5 checksum for any given file in Java? Use commons-codec's DigestUtils.md5Hex. */ public class CrunchifyGetMD5ForFile { public static String crunchifyGetMd5ForFile ( String crunchifyFile ) { // File(): Creates a new File instance by converting the given pathname string into an abstract pathname. // If the given string is the empty string, then the result is the empty abstract pathname. File myFile = new File ( crunchifyFile ) ; return crunchifyGetMd5ForFile ( myFile ) ; } public static String crunchifyGetMd5ForFile ( File crunchifyFile ) { String crunchifyValue = null ; // FileInputStream: A FileInputStream obtains input bytes from a file in a file system. What files are available depends on the host environment. // FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader. FileInputStream crunchifyInputStream = null ; try { crunchifyInputStream = new FileInputStream ( crunchifyFile ) ; // md5Hex converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. // The returned array will be double the length of the passed array, as it takes two characters to represent any given byte. // DigestUtils(): Operations to simplify common MessageDigest tasks. This class is immutable and thread-safe. // However the MessageDigest instances it creates generally won't be. // The MessageDigestAlgorithms class provides constants for standard digest algorithms that can be // used with the getDigest(String) method and other methods that require the Digest algorithm name. // toByteArray(): Get the contents of an InputStream as a byte[]. // This method buffers the input internally, so there is no need to use a BufferedInputStream. crunchifyValue = DigestUtils . md5Hex ( IOUtils . toByteArray ( crunchifyInputStream ) ) ; // md5Hex(): Calculates the MD5 digest and returns the value as a 32 character hex string. } catch ( IOException e ) { log ( "Hey there is an error: " + e ) ; } finally { // closeQuietly(): Unconditionally close an InputStream. // Equivalent to InputStream.close(), except any exceptions will be ignored. // This is typically used in finally blocks. IOUtils . closeQuietly ( crunchifyInputStream ) ; } return crunchifyValue ; } // Simple log util private static void log ( String string ) { System . out . println ( string ) ; } public static void main ( String [ ] agrs ) { // Let's get MD5 for File index.php located at /Users/app/Download/ String file = "//cdn.crunchify.com/Users/app/Download/crunchify.png" ; String md5Value = crunchifyGetMd5ForFile ( file ) ; log ( "File: " + file + " \nValue: " + md5Value ) ; } } |
Sadece yukarıdaki programı bir Java Uygulaması olarak çalıştırın ve buna benzer bir sonuç göreceksiniz.

IntelliJ IDEA konsol sonucu:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Dosya bütünlüğünü doğrulamak için çalışma zamanında bu MD5 sağlama toplamını nasıl kullanacaksınız?
Bu MD5 sağlama toplamını çalışma zamanında MySQL, Oracle vb. gibi y0ur veritabanınızda depolanan değerle karşılaştırabilirsiniz.
Aynısını elde etmenin başka yolları da var, ancak bunu gelecekteki öğreticilerde tartışacağız.