做網(wǎng)站網(wǎng)頁維護 手機App 開發(fā)免費打廣告網(wǎng)站
文章目錄
- 一、實現(xiàn)Sha-256加密
- 1.創(chuàng)建項目
- 2.編寫Cargo.toml文件
- 3.編寫程序代碼
- 二、sha256爆破
- 1.獲取命令行參數(shù)
- 2.讀取文件
- 3.校驗輸入?yún)?shù)
- 4.暴力破解
一、實現(xiàn)Sha-256加密
SHA-256是一種安全哈希算法,主要特點是將輸入的數(shù)據(jù)(無論長度)通過特定的計算方式,生成一個固定長度為256位的哈希值,通常表示為64個十六進制字符?;谄鋯蜗蛐?#xff0c;即從哈希值無法逆推出原始輸入數(shù)據(jù),通常被用于密碼的存儲。
SHA-256是SHA-1算法的后繼者,其名稱來源于安全散列算法2(Secure Hash Algorithm 2)的縮寫。SHA-2系列下包含六個不同的算法標準,分別是SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。這些變體在生成摘要的長度和一些微小細節(jié)上有所不同,但基本結(jié)構(gòu)是一致的。
1.創(chuàng)建項目
$ cargo new sha256_cracker
2.編寫Cargo.toml文件
因為Rust標準庫本身并不直接提供SHA-256功能,通常使用外部庫sha2完成,它提供了SHA-256以及其他SHA-2哈希算法的實現(xiàn)。
[package]
name = "sha256_cracker"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
# 以上為cargo自動創(chuàng)建,添加下面庫就可以[dependencies]
sha2 = "0.9.9"
hex = "0.4"
3.編寫程序代碼
use sha2::{Digest, Sha256}; fn main() { let data = "admin123"; let hash = Sha256::digest(data.as_bytes()); // 將結(jié)果轉(zhuǎn)換為十六進制字符串表示 let hash_hex = hex::encode(hash); println!("SHA-256 hash of '{}' is {}", data, hash_hex); //SHA-256 hash of 'admin123' is 240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9
}
二、sha256爆破
基于其單向性,即從哈希值無法逆推出原始輸入數(shù)據(jù),目前只能通過暴力破解的方式對密碼進行匹配。
1.獲取命令行參數(shù)
use std::env;
fn main() {let args: Vec<String> = env::args().collect();println!("{:?}",args); //["./sha256_cracker", "111", "222"]
}
2.讀取文件
use std::{env,error::Error,fs::File,io::{BufRead, BufReader},
};
fn main() -> Result<(), Box<dyn Error>> {let args: Vec<String> = env::args().collect();let wordlist_file = File::open(&args[1])?;let reader = BufReader::new(&wordlist_file);for line in reader.lines() {let line = line?.trim().to_string();println!("{}", line);}Ok(())
}# /home/kali/Desktop/ctf/pass.txt是密碼字典
$ ./sha256_cracker /home/kali/Desktop/ctf/pass.txt
admin888
test
123qwe
password123
1q2w3e
test123
mysql
....
3.校驗輸入?yún)?shù)
use std::{env,error::Error,fs::File,io::{BufRead, BufReader},
};
// 定義sha245 hash字符串的長度
const SHA256_HEX_STRING_LENGTH: usize = 64;
fn main() -> Result<(), Box<dyn Error>> {let args: Vec<String> = env::args().collect();// 輸入?yún)?shù)校驗,參數(shù)不足提示輸入格式if args.len() != 3 {println!("Usage:");println!("sha256_cracker: <wordlist.txt> <sha256_hash>");return Ok(());}// 校驗sha245十六進制字符串長度,不是64位提示錯誤let hash_to_crack = args[2].trim();if hash_to_crack.len() != SHA256_HEX_STRING_LENGTH {return Err("sha256 hash is not valid".into());}// 讀取文件let wordlist_file = File::open(&args[1])?;let reader = BufReader::new(&wordlist_file);for line in reader.lines() {let line = line?.trim().to_string();println!("{}", line);}Ok(())
}
4.暴力破解
use std::{env,error::Error,fs::File,io::{BufRead, BufReader},
};
use sha2::{Digest, Sha256};
// 定義sha245 hash字符串的長度
const SHA256_HEX_STRING_LENGTH: usize = 64;
fn main() -> Result<(), Box<dyn Error>> {// 獲取輸出參數(shù)let args: Vec<String> = env::args().collect();// 輸入?yún)?shù)校驗,參數(shù)不足提示輸入格式if args.len() != 3 {println!("Usage:");println!("sha256_cracker: <wordlist.txt> <sha256_hash>");return Ok(());}// 校驗sha245十六進制字符串長度,不是64位提示錯誤let hash_to_crack = args[2].trim();if hash_to_crack.len() != SHA256_HEX_STRING_LENGTH {return Err("sha256 hash is not valid".into());}// 讀取文件let wordlist_file = File::open(&args[1])?;let reader = BufReader::new(&wordlist_file);for line in reader.lines() {// 逐行讀取,并對讀取的字符串進行sha256加密let line = line?.trim().to_string();let hash = Sha256::digest(line.as_bytes()); let hash_hex = hex::encode(hash); // 匹配加密字符串,如果一致則輸出if hash_hex == args[2]{println!("Succeed!password is : {}",line);return Ok(());}}println!("Failed ... password is not found!");return Ok(());
}
本文部分內(nèi)容參考《black hat rust》一書