كيفية الحصول على مجموع اختباري MD5 لأي ملف معين في Java؟ كيفية استخدام DigestUtils.md5Hex في Apache Common؟
نشرت: 2021-08-28
يعد تشديد أمان تطبيق مؤسستك أكبر تحد تواجهه أي مؤسسة.
ضع في اعتبارك سيناريو الإنتاج الفعلي هذا:
- لديك تطبيق
reads the value
من ملف - بناءً على قيمة الملف ، فإنه
performs some operations
مثل الإضافة / الحذف / التنفيذ - لقد قمت بنشر هذا التطبيق في بيئة الإنتاج
- ماذا لو قام
unauthorized person
changes the value
هذا الملف دون علمك؟ - يحصل التطبيق الخاص بك
simply gets new value
من ملف ويقوم بتشغيل المنطق الذي قد يتسبب فيunexpected outcome
- إذا كان قد تم تمكين المجموع الاختباري MD5 لهذا الملف - فربما تكون قد قمت
could have created an exception
برسالة خطأ واضحة وكانyou could have prevented disaster
أو نتيجة غير متوقعة
ما هو المجموع الاختباري MD5؟
المجموع الاختباري MD5 لملف هو 128-bit value
، مثل بصمة الملف. يمكن أن يكون مفيدًا لمقارنة الملفات والتحكم في سلامتها.
يكاد يكون من المستحيل الحصول على نفس القيمة لملف مختلف. في هذا البرنامج التعليمي ، سننشئ برنامج Java بسيطًا يقوم بإنشاء وإرجاع قيم MD5 لملف معين. في حالتنا هو ملف index.php
.
هيا بنا نبدأ:
الخطوة 1
قم بإنشاء فئة عامة CrunchifyGetMD5ForFile.java
الخطوة 2
استيراد أقل من اثنين من التبعيات المخضرمين إلى ملف pom.xml
الخاص بمشروعك. البرنامج التعليمي لتحويل المشروع إلى مشروع مخضرم.
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
و commons-io
.
الخطوه 3
قم بإنشاء مجموع اختباري MD5 باستخدام الأداة المساعدة DigestUtils.md5Hex
وطباعة النتيجة على وحدة التحكم.
DigestUtils.md5Hex => تنفيذ encodeHex
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 ; } |
هنا برنامج كامل
قم بإنشاء crunchifyGetMd5ForFile.java
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 ) ; } } |
ما عليك سوى تشغيل البرنامج أعلاه كتطبيق Java وسترى نتيجة مشابهة لهذا.

نتيجة وحدة التحكم IntelliJ IDEA:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
كيف ستستخدم المجموع الاختباري MD5 هذا في وقت التشغيل للتحقق من سلامة الملف؟
يمكنك مقارنة هذا المجموع الاختباري MD5 في وقت التشغيل مع القيمة المخزنة في قاعدة بيانات y0ur ، مثل MySQL و Oracle وما إلى ذلك.
هناك عدد من الطرق الأخرى التي يمكنك من خلالها تحقيق نفس الشيء ولكننا سنناقش هذا في البرامج التعليمية المستقبلية.