Pxiaoer Research
← Back to Blog Hacking with Rust

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