有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVA木卫一。文件帮助从文件夹中选择多个文件并列出哈希值

第一个程序应采用两个输入作为参数:directory1和directory2。程序应计算文件夹目录1中每个文件的哈希值(使用HMAC),并将该哈希值存储在将保存在文件夹目录2下的新文件中。 (b) 。第二个程序应执行验证过程。它还采用与第一个程序相同的两个输入参数。它应该再次生成散列(您可以重用第一个程序中的一些代码),并检查它们是否与directory2中存储的相应值匹配。对于每个文件,该程序应输出两个字符串:文件名和是/否(表示哈希是否匹配)

我做了一些工作,将从一个文件夹生成单个文件的哈希值,我需要帮助从该文件夹生成所有文件的哈希值。这些代码如下

作用

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.security.MessageDigest;

public class HMAC {

public static void main(String args[]) throws Exception {


  String datafile = "/Users/Samip/Desktop/crypto1";

MessageDigest md = MessageDigest.getInstance("SHA1");
FileInputStream fis = new FileInputStream(datafile);
byte[] dataBytes = new byte[1024];

int nread = 0; 

while ((nread = fis.read(dataBytes)) != -1) {
  md.update(dataBytes, 0, nread);
};

byte[] mdbytes = md.digest();

//convert the byte to hex format
StringBuffer sb = new StringBuffer("");



for (int i = 0; i < mdbytes.length; i++) {
    sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}

//System.out.println("SHA-1 value is :: " + sb.toString());





    FileWriter file = new FileWriter("/Users/Samip/Desktop/crypto/output.txt");
    PrintWriter output = new PrintWriter(file);
    output.println(sb.toString());    
    output.close(); 
    System.out.println(sb.toString());

 }
 }

我希望有人能帮我


共 (2) 个答案

  1. # 1 楼答案

    您可以使用this对所有文件进行迭代,并对其使用哈希函数。将结果存储在一个文件中,用\n(换行符)分隔

    String stringout = "" 
    Files.walk(Paths.get("/path/to/dir1")).forEach(filePath -> { 
        if (Files.isRegularFile(filePath)) { 
            //create your hash 
            stringout += hash + "\n" 
        }
    });
    // write stringout to your output file 
    

    对于第二个程序,您可以重用该代码,并使用this从文件中读取哈希值。然后用\n分割它们以获得哈希值,并将它们与哈希函数的输出进行比较

  2. # 2 楼答案

    基本布局/自顶向下方法

    从你所知道的开始,并将其应用到方法中。你从名字和他们需要做的事情开始。一秒钟也不要考虑实现,只考虑逻辑流

    在您的情况下,您将需要以下内容:

    public void createHash(File sourceDir, File targetDir)
    
    public String createHash(File file)
    
    public void writeHash(File toFile, String hash)
    

    将其包装在main()中。

    你需要在那里填写你的类名

    public static void main(String[] args) {
       new YourClass().createHash(new File(args[0]), new File(args[1]));
    }
    

    自上而下实施

    从最外层的方法开始,并尝试正确的方法。剩下的部分可以从伪代码开始

    public void createHash(File sourceDir, File targetDir) {
      for(File f : sourceDir.listFiles()) {
         String hash = createHash(f); //That you almost have
         File target = new File(targetDir, f.getName()+".hash");
         writeHash(target, hash);
      } 
    }
    
    public String createHash(f) {
      return f.getName(); //This is where your existing code will go later
    }
    
    public String writeHash(File target, String hash) {
      System.out.println("I'd write " + hash + " to File " + file.getName());
    }
    

    现在,您的程序应该能够遍历源文件夹,创建(虚拟)散列并打印到系统。列出它将写入的文件

    优化方法

    现在一步一步地做剩下的事情——一次一个方法。直到你做完了或者什么东西坏了——在这种情况下,你会回来寻求帮助

      public String createHash(File datafile) throws IOException {
        //SNIP - YOUR CODE BEGINS
        MessageDigest md = MessageDigest.getInstance("SHA1");
        FileInputStream fis = new FileInputStream(datafile);
        byte[] dataBytes = new byte[1024];
    
        int nread = 0; 
    
        while ((nread = fis.read(dataBytes)) != -1) {
          md.update(dataBytes, 0, nread);
        }
    
        byte[] mdbytes = md.digest();
    
        //convert the byte to hex format
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < mdbytes.length; i++) {
          sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
        }
      //SNAP - YOUR CODE ENDS
      }
      public void writeFile(File target, String hash) {
         try(FileOutputStream fo = new FileOutputStream(target)) {
           fo.write(hash.getBytes());
         } catch(IOException e) {
           System.err.println("No Hash Written for " + target.getName());
         }
      }
    

    工作示例

    import java.io.*;
    import java.security.MessageDigest;
    
    public class Checksums {
    
        public static void main(String[] args) {
            String sourceDir = "/Users/Jan/Desktop/Folder1";
            String targetDir = "/Users/Jan/Desktop/Folder2";
            try {
                new Checksums().createHash(new File(sourceDir), new File(targetDir));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private void createHash(File sourceDir, File targetDir) throws Exception {
            for (File f : sourceDir.listFiles()) {
                String hash = createHash(f); // That you almost have
                File target = new File(targetDir, f.getName() + ".hash");
                writeHash(target, hash);
            }
        }
    
        public String createHash(File datafile) throws Exception {
            // SNIP - YOUR CODE BEGINS
            MessageDigest md = MessageDigest.getInstance("SHA1");
            FileInputStream fis = new FileInputStream(datafile);
            byte[] dataBytes = new byte[1024];
    
            int nread = 0;
    
            while ((nread = fis.read(dataBytes)) != -1) {
                md.update(dataBytes, 0, nread);
            }
    
            byte[] mdbytes = md.digest();
    
            // convert the byte to hex format
            StringBuffer sb = new StringBuffer("");
            for (int i = 0; i < mdbytes.length; i++) {
                sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            // SNAP - YOUR CODE ENDS
            return sb.toString();
        }
    
        public void writeHash(File target, String hash) {
            try (FileOutputStream fo = new FileOutputStream(target)) {
                fo.write(hash.getBytes());
                System.out.println("Hash written for " + target.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("No Hash Written for " + target.getName());
            }
        }
    
    }