Rust语言之sha-256爆破

文章目录


一、实现Sha-256加密

SHA-256是一种安全哈希算法,主要特点是将输入的数据(无论长度)通过特定的计算方式,生成一个固定长度为256位的哈希值,通常表示为64个十六进制字符。基于其单向性,即从哈希值无法逆推出原始输入数据,通常被用于密码的存储。

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。这些变体在生成摘要的长度和一些微小细节上有所不同,但基本结构是一致的。

1.创建项目

shell 复制代码
$ cargo new sha256_cracker

2.编写Cargo.toml文件

因为Rust标准库本身并不直接提供SHA-256功能,通常使用外部库sha2完成,它提供了SHA-256以及其他SHA-2哈希算法的实现。

shell 复制代码
[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自动创建,添加下面库就可以

[dependencies]  
sha2 = "0.9.9"
hex = "0.4"

3.编写程序代码

rust 复制代码
use sha2::{Digest, Sha256};  
  
fn main() {  
    let data = "admin123";  
    let hash = Sha256::digest(data.as_bytes());  
  
    // 将结果转换为十六进制字符串表示  
    let hash_hex = hex::encode(hash);  
    println!("SHA-256 hash of '{}' is {}", data, hash_hex);  //SHA-256 hash of 'admin123' is 240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9
}

二、sha256爆破

基于其单向性,即从哈希值无法逆推出原始输入数据,目前只能通过暴力破解的方式对密码进行匹配。

1.获取命令行参数

rust 复制代码
use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:?}",args); //["./sha256_cracker", "111", "222"]
}

2.读取文件

rust 复制代码
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.校验输入参数

rust 复制代码
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();
    // 输入参数校验,参数不足提示输入格式
    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.暴力破解

rust 复制代码
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>> {
	// 获取输出参数
    let args: Vec<String> = env::args().collect();
    // 输入参数校验,参数不足提示输入格式
    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(());
}

本文部分内容参考《black hat rust》一书

相关推荐
крон2 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan2 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊3 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1183 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之3 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头4 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu4 小时前
java内存模型JMM
java·开发语言
我很好我还能学6 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿6 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习