Java 다이제스트와 외부 유틸리티의 다른 결과
Windows Calculator 파일의 해시 값을 생성하기 위해 간단한 Java 클래스를 작성했습니다.사용하고 있다Windows 7 Professional with SP1
.난 시도했다.Java 6.0.29
그리고.Java 7.0.03
왜 자바와 (다양한!) 외부 유틸리티 및/또는 웹사이트의 해시값이 다른지 누가 알 수 있을까요?외부 데이터가 모두 일치하며 Java만 다른 결과를 반환합니다.
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();
}
}
알겠습니다. Windows 파일 시스템은 프로세스의 아키텍처에 따라 다르게 동작합니다.이 기사에서는 특히 다음과 같은 모든 것에 대해 설명합니다.
그러나 시스템 경로가 하드 코드화되어 64비트 Windows에서 실행되고 있는 32비트 애플리케이션은 어떻습니까?어떻게 하면 새로운 시스템을 찾을 수 있을까요?프로그램 코드가 변경되지 않은 WOW64 폴더입니다.답변은 에뮬레이터가 System32 폴더에 대한 콜을 System32 폴더에 투과적으로 리다이렉트하기 때문에 폴더가 System32 폴더에 하드코드되어 있어도 됩니다(C: 등).\Windows\System32) 에뮬레이터는 SysWOW64 폴더가 대신 사용되는 것을 확인합니다.따라서 System32 폴더를 사용하는 동일한 소스 코드를 변경 없이 32비트 및 64비트 프로그램 코드로 컴파일할 수 있습니다.
복사해 보다calc.exe
다른 곳으로...동일한 도구를 다시 실행합니다.Java와 같은 결과를 얻을 수 있습니다.Windows 파일 시스템의 무언가가 Java에 제공하는 데이터와는 다른 데이터를 툴에 제공하고 있습니다.Windows 디렉토리에 있는 것과 관계가 있기 때문에, 「다른」으로 취급되고 있는 것이 확실합니다.
게다가 그것을 C#에 재현해 본 결과, 실행 중인 프로세스의 아키텍처에 따라 다르다는 것을 알 수 있었습니다.다음은 샘플 프로그램입니다.
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
언급URL : https://stackoverflow.com/questions/9728056/different-results-with-javas-digest-versus-external-utilities
'programing' 카테고리의 다른 글
정렬 및 회전 배열 검색 (0) | 2022.07.03 |
---|---|
Android Eclipse - *.apk를 찾을 수 없습니다. (0) | 2022.07.03 |
MAC에 JRE 8이 설치되어 있어도 "No Java Runtime present" 가 터미널에 표시됩니다. (0) | 2022.07.03 |
변환을 커밋할 필요가 없는 vuex 작업 (0) | 2022.07.03 |
글로벌 vue 컴포넌트에서 메서드를 호출하려면 어떻게 해야 합니까? (0) | 2022.07.03 |