第一个程序应该将两个输入作为参数:directory1和directory2。程序应该为文件夹directory1中的每个文件计算一个哈希值(使用HMAC),并将该哈希值存储在将保存在文件夹directory2下的新文件中。 (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());
}
}
我希望有人能帮助我。
答案 0 :(得分:0)
您可以使用this迭代所有文件并在其上使用哈希函数。将结果存储在一个文件中,用var time_interval = 5000;
setInterval(function () {
$.ajax({
url: 'your_path_to_the_api',
data: '',
cache: false,
type: 'POST',
success: function (data) {
$('#container').text(data);
}
});
}, time_interval);
(换行符)
\n
对于第二个程序,您可以重用该代码并使用this从文件中读取哈希值。然后用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
拆分它们以得到哈希值并将它们与哈希函数的输出进行比较。
答案 1 :(得分:0)
基本布局/自上而下方法
从您所知道的内容开始,并将其纳入方法中。您从名称和他们需要执行的东西开始。不要考虑实施一秒钟,只是逻辑流程。
在您的情况下,您需要以下内容:
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());
}
现在你的程序应该能够遍历源文件夹,创建(虚拟)哈希并打印到System.out它会写什么文件。
优化方法
现在逐步完成其余的工作 - 一次一个方法。直到你完成或出现故障 - 在这种情况下你会回来寻求帮助。
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());
}
}
}