从Java中路径的内容创建MD5哈希

从Java中路径的内容创建MD5哈希,java,hash,cryptography,md5,Java,Hash,Cryptography,Md5,我想创建一个程序,它从路径的输入生成MD5哈希。下面的代码仅根据路径名创建哈希。如何从路径的输入生成MD5哈希?谢谢大家! public static void main (String[]args) { Scanner sc = new Scanner(System.in); String path = sc.next(); System.out.println("MD5: "+MD5(path)); //Methode MD5

我想创建一个程序,它从路径的输入生成MD5哈希。下面的代码仅根据路径名创建哈希。如何从路径的输入生成MD5哈希?谢谢大家!

public static void main (String[]args) {
    Scanner sc = new Scanner(System.in);
    
    
    String path = sc.next();
    System.out.println("MD5: "+MD5(path)); //Methode MD5 auf "path" angewandt
}

public static String MD5(String input) {
    
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] messageDigest = md.digest(input.getBytes());
        BigInteger number = new BigInteger (1, messageDigest);
        String hashtext = number.toString(16);
        while (hashtext.length()<32) {
            hashtext = "0" + hashtext;
        }
        return hashtext;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    
}
publicstaticvoidmain(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
字符串路径=sc.next();
System.out.println(“MD5:+MD5(path));//Methode MD5 auf“path”angewandt
}
公共静态字符串MD5(字符串输入){
试一试{
MessageDigest md=MessageDigest.getInstance(“MD5”);
byte[]messageDigest=md.digest(input.getBytes());
BigInteger编号=新的BigInteger(1,messageDigest);
字符串hashtext=number.toString(16);

而(hashtext.length()您可以使用以下命令读取文件内容:

String filepath = "" ; // the full path from system.in
byte[] content = Files.readAllBytes(Paths.get(filepath));
之后,您可以获取此字节数组的哈希:

public static byte[] MD5(byte[] data) {
    try {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data);
        return messageDigest.digest();
    }
    catch(Exception e){
        // any processing
    }
}
要显示二进制内容(字节数组)或将其作为字符串发送,可以使用任何base-16/32/64编码安全地进行转换:

String hashString = Base64.getEncoder().encodeToString(bytesArray);
因此,最终代码可能是:

import java.nio.file.*;
import java.util.*;
import java.security.*;

public class Demo {
    public static void main (String[]args) throws Exception {
        Scanner sc = new Scanner(System.in);
        String path = sc.nextLine(); // read all the string from keyboard
        
        byte[] content = Files.readAllBytes(Paths.get(path));
        byte[] hash = MD5(content);
        
        String hashString = Base64.getEncoder().encodeToString(hash);
        System.out.println("MD5: "+ hashString); 
    }
    
    public static byte[] MD5(byte[] data) throws Exception{
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data);
        return messageDigest.digest();
    }    
}

散列可以从一个以上的零开始,然后被BigInteger.toString(16)抑制。因此,我强烈建议使用不同的方法将摘要转换为十六进制。谢谢,但对于具有相同内容的两个路径,我仍然没有得到与输出相同的MD5哈希。哪里会出现错误,输出取决于路径名而不是路径的内容?上面的代码基于文件内容而不是路径计算哈希o如果散列不同,则文件的内容肯定不相同!尝试对同一文件进行两次散列,您将看到相同的输出,然后复制该文件并计算新复制的文件,您将获得相同的输出。谢谢,它现在起作用了。但是有没有可能为包含更多文件的路径创建MD5散列f只有一个文件。您的意思是哈希此路径中的所有文件?您可以先枚举文件(请参阅),然后对每个文件执行for循环,并应用上述代码。