01.SHA-1 hash cracker
hash cracker的意义
hash cracker的意义
主要是为了熟悉Rust的语法,市面上有很多的hash cracker,比如hashcat等程序,他们优化得很好,建议使用他们。
破解的流程

从上面的SHA-1函数的输入和输出可以看到,我们需要用一个wordlist生成hash。然后和已有的hash进行比较。
那么我们这个工具的命令行如下:
sha1_cracker:
我们开始用一个初始程序,这个程序得到传进来的参数并检查参数是否符合要求
use std:: {
env,
error::Error,
};
const SHA1_HEX_STRING_LENGTH: usize = 40;
fn main() -> Result> {
let args: Vec = env::args().collect();
if args.len() !=3 {
//println!("input error");
println!("Usage:\n sha1_cracker: ");
return Ok(());
}
let hash_to_crack = args[2].trim();
if hash_to_crack.len() != SHA1_HEX_STRING_LENGTH {
return Err("sha1 hash is not valid".into());
}
Ok(())
}
后面就开始读字典来生成hash值并做对比
use sha1::Digest;
use std:: {
env,
error::Error,
fs::File,
io::{BufRead, BufReader},
};
const SHA1_HEX_STRING_LENGTH: usize = 40;
fn main() -> Result> {
let args: Vec = env::args().collect();
if args.len() !=3 {
//println!("input error");
println!("Usage:\n sha1_cracker: ");
return Ok(());
}
let hash_to_crack = args[2].trim();
if hash_to_crack.len() != SHA1_HEX_STRING_LENGTH {
return Err("sha1 hash is not valid".into());
}
let worldlist_file = File::open(&args[1])?;
let reader = BufReader::new(&worldlist_file);
for line in reader.lines() {
let password = line?.trim().to_string();
let gen_password = hex::encode(sha1::Sha1::digest(password.as_bytes()));
println!("{}", gen_password);
if hash_to_crack == gen_password {
println!("password found: {}", &password);
return Ok(());
}
}
println!("passowrd not found in wordlist!");
Ok(())
}
Github 链接:https://github.com/xxg1413/Hacking-with-Rust/tree/main/sha1_cracker