জাভার ডাইজেস্ট বনাম বাহ্যিক ইউটিলিটি সহ বিভিন্ন ফলাফল


194

উইন্ডোজ ক্যালকুলেটর ফাইলটির হ্যাশ মান উত্পন্ন করতে আমি একটি সাধারণ জাভা ক্লাস লিখেছি। আমি ব্যবহার করছি Windows 7 Professional with SP1। আমি চেষ্টা করেছি Java 6.0.29এবং Java 7.0.03। কেউ আমাকে বলতে পারেন কেন আমি জাভা বনাম (বহু!) বহিরাগত ইউটিলিটি এবং / অথবা ওয়েবসাইটগুলি থেকে বিভিন্ন হ্যাশ মান পাচ্ছি? বাহ্যিক সবকিছু একে অপরের সাথে মেলে, কেবল জাভা বিভিন্ন ফলাফল দেখাচ্ছে।

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.CRC32;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Checksum 
{
    private static int size = 65536;
    private static File calc = new File("C:/Windows/system32/calc.exe");

    /*
        C:\Windows\System32\calc.exe (verified via several different utilities)
        ----------------------------
        CRC-32b = 8D8F5F8E
        MD5     = 60B7C0FEAD45F2066E5B805A91F4F0FC
        SHA-1   = 9018A7D6CDBE859A430E8794E73381F77C840BE0
        SHA-256 = 80C10EE5F21F92F89CBC293A59D2FD4C01C7958AACAD15642558DB700943FA22
        SHA-384 = 551186C804C17B4CCDA07FD5FE83A32B48B4D173DAC3262F16489029894FC008A501B50AB9B53158B429031B043043D2
        SHA-512 = 68B9F9C00FC64DF946684CE81A72A2624F0FC07E07C0C8B3DB2FAE8C9C0415BD1B4A03AD7FFA96985AF0CC5E0410F6C5E29A30200EFFF21AB4B01369A3C59B58


        Results from this class
        -----------------------
        CRC-32  = 967E5DDE
        MD5     = 10E4A1D2132CCB5C6759F038CDB6F3C9
        SHA-1   = 42D36EEB2140441B48287B7CD30B38105986D68F
        SHA-256 = C6A91CBA00BF87CDB064C49ADAAC82255CBEC6FDD48FD21F9B3B96ABF019916B    
    */    

    public static void main(String[] args)throws Exception {
        Map<String, String> hashes = getFileHash(calc);
        for (Map.Entry<String, String> entry : hashes.entrySet()) {
            System.out.println(String.format("%-7s = %s", entry.getKey(), entry.getValue()));
        }
    }

    private static Map<String, String> getFileHash(File file) throws NoSuchAlgorithmException, IOException {
        Map<String, String> results = new LinkedHashMap<String, String>();

        if (file != null && file.exists()) {
            CRC32 crc32 = new CRC32();
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
            MessageDigest sha256 = MessageDigest.getInstance("SHA-256");

            FileInputStream fis = new FileInputStream(file);
            byte data[] = new byte[size];
            int len = 0;
            while ((len = fis.read(data)) != -1) {
                crc32.update(data, 0, len);
                md5.update(data, 0, len);
                sha1.update(data, 0, len);
                sha256.update(data, 0, len);
            }
            fis.close();

            results.put("CRC-32", toHex(crc32.getValue()));
            results.put(md5.getAlgorithm(), toHex(md5.digest()));
            results.put(sha1.getAlgorithm(), toHex(sha1.digest()));
            results.put(sha256.getAlgorithm(), toHex(sha256.digest()));
        }
        return results;
    }

    private static String toHex(byte[] bytes) {
        String result = "";
        if (bytes != null) {
            StringBuilder sb = new StringBuilder(bytes.length * 2);
            for (byte element : bytes) {
                if ((element & 0xff) < 0x10) {
                    sb.append("0");
                }
                sb.append(Long.toString(element & 0xff, 16));
            }
            result = sb.toString().toUpperCase();
        }
        return result;
    }

    private static String toHex(long value) {
        return Long.toHexString(value).toUpperCase();
    }

}

আমার অনুমান যে আপনার টোএক্সটি ভুল। আপনি যদি int newElement = ((int) element) & 0xffএটির পরিবর্তে এবং যদি এটি ব্যবহার করেন তবে তা কি আপনার সমস্যার সমাধান করবে?
zapl

64
চেক সমষ্টি গণনা করার সমান্তরালে, কিছু টেম্পের ফাইলটিতে ফাইলটি অনুলিপি করুন, যাতে আপনি অন্যান্য সরঞ্জামগুলি ব্যবহার করার সময় জাভা যা পান তার সাথে তুলনা করতে পারেন। উইন্ডোজ এর মতো অদ্ভুত হতে পারে ... আমি
জাভাটিকে কখনই

3
সমস্ত প্রোগ্রামারদের এই মত প্রোগ্রাম করা উচিত! কোডটি খুব পরিষ্কার এবং ঝরঝরে।
মার্টিজন কোর্টেক

2
@ user567496: এটা কি আপনার কোড সাধ্যমতো অন্যান্য জাভা রয়েছে SHA-1 বাস্তবায়নে তুলনা কমান্ড তুলনায় সঠিক রয়েছে SHA-1 হ্যাশ দেয় জন্য sha1sum util ... (লিনাক্স ফাইল, calc.exe না সাথে পরীক্ষিত)
TacticalCoder

1
@ ফিডো: এক্ষেত্রে এটি চরসেটের সমস্যা হতে পারে না কারণ ওপি কাঁচা বাইটস পড়ছে: তিনি চরিত্রগুলি ডিকোডিং করছেন না।
ট্যাকটিক্যাল কোডার

উত্তর:


239

বুঝেছি. আপনার প্রক্রিয়াটির স্থাপত্যের উপর নির্ভর করে উইন্ডোজ ফাইল সিস্টেমটি আলাদা আচরণ করছে। এই নিবন্ধটি সমস্ত ব্যাখ্যা করে - বিশেষত:

তবে 32-বিট অ্যাপ্লিকেশনগুলির বিষয়ে কী কী সিস্টেম পাথটি হার্ড কোডিং করেছে এবং 64৪-বিট উইন্ডোয় চলছে? প্রোগ্রাম কোডে কোনও পরিবর্তন ছাড়াই তারা কীভাবে নতুন সিসডাব্লু 6464 ফোল্ডারটি খুঁজে পাবে, আপনি ভাবতে পারেন। উত্তরটি হ'ল এমুলেটরটি সিস্টেম 32 ফোল্ডারে সিসডাব্লু 64 ফোল্ডারে স্বচ্ছভাবে পুনঃনির্দেশ করে তাই ফোল্ডারটি সিস্টেম 32 ফোল্ডারে (যেমন: সি: \ উইন্ডোজ \ সিস্টেম32 এর মতো) হার্ড কোডড থাকলেও এমুলেটর নিশ্চিত করে যে সিসডাব্লু 64 ফোল্ডারটি ব্যবহার করেছে কিনা তা নিশ্চিত করা হবে will । সিস্টেম32 ফোল্ডার ব্যবহার করে একই উত্স কোডটি কোনও পরিবর্তন ছাড়াই 32-বিট এবং 64-বিট প্রোগ্রাম কোড উভয় ক্ষেত্রেই সংকলিত হতে পারে।

calc.exeঅন্য কোথাও অনুলিপি করার চেষ্টা করুন ... তারপরে আবার একই সরঞ্জামগুলি চালান। আপনি জাভা হিসাবে একই ফলাফল পাবেন। কিছু উইন্ডোজ ফাইল সিস্টেম সম্পর্কে সরঞ্জাম তুলনায় এটি জাভা প্রদান এর বিভিন্ন তথ্য প্রদান করা হয় ... আমি নিশ্চিত করুন যে এটি এটা উইন্ডোজ ডিরেক্টরির মধ্যে হচ্ছে, এবং এইভাবে সম্ভবত "ভিন্নভাবে" ঘাঁটা কি কিছু নই।

তদুপরি, আমি এটি সি # তে পুনরুত্পাদন করেছি এবং দেখেছি যে এটি আপনি যে প্রক্রিয়াটি চালাচ্ছেন তার আর্কিটেকচারের উপর নির্ভর করে । সুতরাং এখানে একটি নমুনা প্রোগ্রাম:

using System;
using System.IO;
using System.Security.Cryptography;

class Test
{
    static void Main()
    {
        using (var md5 = MD5.Create())
        {
            string path = "c:/Windows/System32/Calc.exe";
            var bytes = md5.ComputeHash(File.ReadAllBytes(path));
            Console.WriteLine(BitConverter.ToString(bytes));
        }
    }
}

এবং এখানে একটি কনসোল সেশন (সংকলক থেকে বিয়োগ বকবক):

c:\users\jon\Test>csc /platform:x86 Test.cs    

c:\users\jon\Test>test
60-B7-C0-FE-AD-45-F2-06-6E-5B-80-5A-91-F4-F0-FC

c:\users\jon\Test>csc /platform:x64 Test.cs

c:\users\jon\Test>test
10-E4-A1-D2-13-2C-CB-5C-67-59-F0-38-CD-B6-F3-C9

64
এর দুটি সংস্করণ রয়েছে calc.exe: C:\Windows\system32` and 32bit in সি: bit উইন্ডোজ ys সিএসডাব্লু W৪`` এ bit৪ বিট ` 32 বিট প্রক্রিয়াতে C:\Windows\system32` is mapped to সিটির জন্য সামঞ্জস্যের জন্য : W উইন্ডোজ ys সিএসডাব্লু 64` ` Bit৪ বিট প্রসেসগুলি bit৪ বিট ক্যালাক চালু করবে, ৩২ বিট ৩২ বিট ক্যালক প্রসেস করবে। তাদের চেকসামগুলি পৃথক করে আশ্চর্য হওয়ার কিছু নেই। আপনি যদি ফাইলটি খোলা রাখেন এবং handles.exeপ্রসেস এক্সপ্লোরারটির সাথে সন্ধান করেন তবে আপনি আলাদা পথ দেখতে পাবেন।
রিচার্ড

25
@ জনের যে কিছু ফাইল ফাইল সিস্টেম পুনঃনির্দেশক হিসাবে পরিচিত।
ডেভিড হেফারনান

9
'ডেভিডহেফার্নান' মতামতগুলি সম্ভবত 'কার্যকর' এর সংজ্ঞা সহ আলাদা হয়। এই সমস্ত ভার্চুয়ালাইজেশন অন্তত বিস্ময়ের নীতি লঙ্ঘন করে এবং ব্যয় যুক্ত করে (বরাদ্দ এবং রানটাইম)। অন্যান্য অপারেটিং সিস্টেমগুলি 32-অন -৪৪ সমর্থন এবং আরও কম অ্যাপ্লিকেশনগুলির সাথে আরও ভাল অ্যাপ্লিকেশন ভার্চুয়ালাইজেশন সরবরাহ করতে সক্ষম হয় (Wow64 এ আবর্জনা সংগ্রহের প্রোগ্রাম চালানোর চেষ্টা করুন, বা ওপির মতো এমডি 5 যোগফলগুলির সাথে তুলনা করার চেষ্টা করুন এবং কয়েকটি অন্যান্য কুলুঙ্গির ক্ষেত্রে)।
শেহে

5
কখনও কখনও আমি ভাবছি যে লোকেরা আপনাকে উত্সাহিত করে কারণ আপনি জন স্কিট, কেবলমাত্র উত্তরের কারণে নয় । আমি উত্তরটি ভাল বা কিছু না বলে বলছি না, তবে 145 টি আপত্তি জানায় যখন উত্তরটি "উইন্ডোজগুলিতে কিছু ঘটছে" (ন্যায্য বলতে গেলে আপনি একটি লিঙ্ক সরবরাহ করেন, তবে এখনও) মনে হয় লোকেরা তখন আপনার উত্তরটি ঠিকভাবে বিবেচনা করছে যখন তারা upvote। আমি আপনাকে ঘৃণা করছি না, তবে এর অর্থ হ'ল এটি আপনাকে ধরার আগে কিছুটা সময় হয়ে যাবে: পি
জেসন রিজ

5
ব্লগটি আমি এটি কীভাবে খুঁজে পেয়েছি। আমি কিছু জোন স্কিট যাদু নিয়ে আশা করছিলাম তবে আমার মনে হয়েছিল "আরে, আমি এটি করতে পারতাম"। সম্ভবত প্রায় হিসাবে দ্রুত না কিন্তু আপনি সেখানে যান। ঠিক আছে আমি না পারে পারে, কিন্তু এখনও। ক্যাপটি হিসাবে, এতে কিছুটা সান্ত্বনা নেই কারণ এর অর্থ হ'ল যে কোনও নির্দিষ্ট দিন আপনি এটিতে পৌঁছে যাবেন, এবং তাই আমি আপনাকে কখনই ধরতে পারি না। ওহ ভাল ...
জেসন রিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.