Rust哈希算法库sm3的使用:高性能SM3密码学哈希函数实现与数据完整性校验

RustCrypto: SM3

SM3 (OSCCA GM/T 0004-2012) 哈希函数的纯 Rust 实现。

文档

最低支持的 Rust 版本

Rust 1.41 或更高版本。

最低支持的 Rust 版本可能会在未来更改,但这将通过次要版本升级来完成。

语义化版本策略

  • 此库的所有默认开启功能都受语义化版本控制覆盖
  • 如上所述,MSRV 被视为语义化版本控制的豁免项

许可证

根据以下任一许可证授权:

  • Apache License, Version 2.0
  • MIT license

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交包含在作品中的任何贡献均应按照上述双重许可,无需任何附加条款或条件。

安装

在项目目录中运行以下 Cargo 命令:

cargo add sm3

或者将以下行添加到您的 Cargo.toml 中:

sm3 = “0.4.2”

完整示例代码:

use sm3::{Digest, Sm3};

fn main() {
    // 创建一个 SM3 哈希对象
    let mut hasher = Sm3::new();
    
    // 输入要哈希的数据
    let data = b"Hello, world!";
    
    // 处理数据
    hasher.update(data);
    
    // 获取哈希结果
    let result = hasher.finalize();
    
    // 打印哈希值(十六进制格式)
    println!("SM3 hash: {:x}", result);
    
    // 数据完整性校验示例
    let original_data = b"Important message";
    let mut hasher2 = Sm3::new();
    hasher2.update(original_data);
    let original_hash = hasher2.finalize();
    
    // 假设传输后接收到的数据
    let received_data = b"Important message";
    let mut hasher3 = Sm3::new();
    hasher3.update(received_data);
    let received_hash = hasher3.finalize();
    
    // 验证数据完整性
    if original_hash == received_hash {
        println!("Data integrity verified: hashes match");
    } else {
        println!("Data integrity check failed: hashes do not match");
    }
}

基于上述示例的完整演示代码:

use sm3::{Digest, Sm3};

fn main() {
    // 示例1: 基本哈希计算
    println!("=== 基本哈希计算示例 ===");
    
    // 创建 SM3 哈希器实例
    let mut hasher = Sm3::new();
    
    // 定义要哈希的数据
    let message = b"Hello, RustCrypto SM3!";
    
    // 更新哈希器状态
    hasher.update(message);
    
    // 完成哈希计算并获取结果
    let hash_result = hasher.finalize();
    
    // 以十六进制格式输出哈希值
    println!("输入消息: {}", String::from_utf8_lossy(message));
    println!("SM3 哈希值: {:x}", hash_result);
    println!();

    // 示例2: 数据完整性验证
    println!("=== 数据完整性验证示例 ===");
    
    // 原始数据
    let original_text = b"Critical security data";
    println!("原始数据: {}", String::from_utf8_lossy(original_text));
    
    // 计算原始数据的哈希
    let mut original_hasher = Sm3::new();
    original_hasher.update(original_text);
    let original_hash = original_hasher.finalize();
    println!("原始哈希: {:x}", original_hash);
    
    // 模拟接收到的数据(相同内容)
    let received_text = b"Critical security data";
    println!("接收数据: {}", String::from_utf8_lossy(received_text));
    
    // 计算接收数据的哈希
    let mut received_hasher = Sm3::new();
    received_hasher.update(received_text);
    let received_hash = received_hasher.finalize();
    println!("接收哈希: {:x}", received_hash);
    
    // 验证哈希一致性
    if original_hash == received_hash {
        println!("✅ 验证成功: 数据完整性得到保证");
    } else {
        println!("❌ 验证失败: 数据可能已被篡改");
    }
    println!();

    // 示例3: 分块处理大数据
    println!("=== 分块处理示例 ===");
    
    let chunk1 = b"这是第一块数据";
    let chunk2 = b"这是第二块数据";
    let chunk3 = b"这是最后一块数据";
    
    let mut chunk_hasher = Sm3::new();
    chunk_hasher.update(chunk1);
    chunk_hasher.update(chunk2);
    chunk_hasher.update(chunk3);
    
    let chunk_hash = chunk_hasher.finalize();
    println!("分块数据哈希: {:x}", chunk_hash);
    
    // 对比一次性处理相同数据的哈希
    let combined_data = [chunk1, chunk2, chunk3].concat();
    let mut combined_hasher = Sm3::new();
    combined_hasher.update(&combined_data);
    let combined_hash = combined_hasher.finalize();
    
    println!("合并数据哈希: {:x}", combined_hash);
    println!("分块处理与合并处理结果一致: {}", chunk_hash == combined_hash);
}

1 回复

Rust哈希算法库sm3的使用:高性能SM3密码学哈希函数实现与数据完整性校验

介绍

sm3是一个Rust实现的SM3密码学哈希函数库,符合中国国家密码管理局发布的GM/T 0004-2012标准。该库提供高性能的SM3哈希计算,支持数据完整性校验、数字签名等安全应用场景。

使用方法

添加依赖

在Cargo.toml中添加:

[dependencies]
sm3 = "0.3"

基本使用示例

use sm3::{Sm3, Digest};

fn main() {
    // 创建SM3哈希实例
    let mut hasher = Sm3::new();
    
    // 输入数据
    let data = b"Hello, SM3!";
    hasher.update(data);
    
    // 获取哈希结果
    let result = hasher.finalize();
    
    println!("SM3哈希值: {:x}", result);
}

流式处理大数据

use sm3::{Sm3, Digest};
use std::fs::File;
use std::io::Read;

fn hash_file(path: &str) -> std::io::Result<String> {
    let mut file = File::open(path)?;
    let mut hasher = Sm3::new();
    
    let mut buffer = [0; 1024];
    loop {
        let bytes_read = file.read(&mut buffer)?;
        if bytes_read == 0 {
            break;
        }
        hasher.update(&buffer[..bytes_read]);
    }
    
    Ok(format!("{:x}", hasher.finalize()))
}

数据完整性校验示例

use sm3::{Sm3, Digest};

fn verify_data_integrity(original_data: &[u8], received_hash: &str) -> bool {
    let mut hasher = Sm3::new();
    hasher.update(original_data);
    let computed_hash = format!("{:x}", hasher.finalize());
    
    computed_hash == received_hash
}

fn main() {
    let data = b"重要数据内容";
    let expected_hash = "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0";
    
    if verify_data_integrity(data, expected_hash) {
        println!("数据完整性验证通过");
    } else {
        println!("数据可能已被篡改");
    }
}

自定义结构体的哈希计算

use sm3::{Sm3, Digest};
use std::hash::{Hash, Hasher};

#[derive(Hash)]
struct User {
    id: u32,
    name: String,
    email: String,
}

impl User {
    fn compute_hash(&self) -> String {
        let mut hasher = Sm3::new();
        self.hash(&mut hasher);
        format!("{:x}", hasher.finalize())
    }
}

fn main() {
    let user = User {
        id: 1,
        name: "张三".to_string(),
        email: "zhangsan@example.com".to_string(),
    };
    
    println!("用户哈希值: {}", user.compute_hash());
}

完整示例demo

use sm3::{Sm3, Digest};
use std::fs::File;
use std::io::Read;
use std::hash::{Hash, Hasher};

// 基本使用示例
fn basic_usage() {
    println!("=== 基本使用示例 ===");
    
    // 创建SM3哈希实例
    let mut hasher = Sm3::new();
    
    // 输入数据
    let data = b"Hello, SM3!";
    hasher.update(data);
    
    // 获取哈希结果
    let result = hasher.finalize();
    
    println!("SM3哈希值: {:x}", result);
    println!();
}

// 文件哈希计算
fn file_hashing() -> std::io::Result<()> {
    println!("=== 文件哈希计算 ===");
    
    // 创建一个测试文件
    let test_content = "这是一个测试文件内容,用于演示SM3文件哈希计算";
    std::fs::write("test_file.txt", test_content)?;
    
    let mut file = File::open("test_file.txt")?;
    let mut hasher = Sm3::new();
    
    let mut buffer = [0; 1024];
    loop {
        let bytes_read = file.read(&mut buffer)?;
        if bytes_read == 0 {
            break;
        }
        hasher.update(&buffer[..bytes_read]);
    }
    
    let hash_result = format!("{:x}", hasher.finalize());
    println!("文件哈希值: {}", hash_result);
    
    // 清理测试文件
    std::fs::remove_file("test_file.txt")?;
    println!();
    Ok(())
}

// 数据完整性验证
fn data_integrity_check() {
    println!("=== 数据完整性验证 ===");
    
    let original_data = b"重要业务数据,需要确保完整性";
    let mut hasher = Sm3::new();
    hasher.update(original_data);
    let correct_hash = format!("{:x}", hasher.finalize());
    
    // 模拟接收到的数据和哈希
    let received_data = b"重要业务数据,需要确保完整性"; // 未被篡改
    let received_hash = correct_hash.clone();
    
    let mut verification_hasher = Sm3::new();
    verification_hasher.update(received_data);
    let computed_hash = format!("{:x}", verification_hasher.finalize());
    
    if computed_hash == received_hash {
        println!("✅ 数据完整性验证通过");
    } else {
        println!("❌ 数据可能已被篡改");
    }
    
    // 测试篡改情况
    let tampered_data = b"重要业务数据,已被恶意修改";
    let mut tampered_hasher = Sm3::new();
    tampered_hasher.update(tampered_data);
    let tampered_hash = format!("{:x}", tampered_hasher.finalize());
    
    if tampered_hash == correct_hash {
        println!("✅ 数据完整性验证通过");
    } else {
        println!("❌ 数据可能已被篡改");
    }
    println!();
}

// 自定义结构体哈希
#[derive(Hash)]
struct Product {
    id: u32,
    name: String,
    price: f64,
    description: String,
}

impl Product {
    fn compute_hash(&self) -> String {
        let mut hasher = Sm3::new();
        self.hash(&mut hasher);
        format!("{:x}", hasher.finalize())
    }
}

fn custom_struct_hashing() {
    println!("=== 自定义结构体哈希 ===");
    
    let product = Product {
        id: 1001,
        name: "高性能笔记本电脑".to_string(),
        price: 5999.99,
        description: "配备最新处理器和独立显卡".to_string(),
    };
    
    let product_hash = product.compute_hash();
    println!("产品哈希值: {}", product_hash);
    
    // 相同数据的哈希应该相同
    let same_product = Product {
        id: 1001,
        name: "高性能笔记本电脑".to_string(),
        price: 5999.99,
        description: "配备最新处理器和独立显卡".to_string(),
    };
    
    let same_hash = same_product.compute_hash();
    println!("相同产品哈希值: {}", same_hash);
    println!("哈希是否一致: {}", product_hash == same_hash);
    println!();
}

fn main() -> std::io::Result<()> {
    println!("SM3哈希算法库使用演示");
    println!("=====================\n");
    
    basic_usage();
    file_hashing()?;
    data_integrity_check();
    custom_struct_hashing();
    
    println!("演示完成!");
    Ok(())
}

性能优化提示

  1. 对于大量数据,使用update()方法分块处理以避免内存压力
  2. 重用Hasher实例可以减少内存分配
  3. 考虑使用sm3::SM3的直接函数调用以获得最佳性能

安全注意事项

  • SM3哈希不可逆,适合密码存储
  • 对于敏感数据,建议结合盐值使用
  • 定期更新哈希算法以应对新的安全威胁

这个库提供了简单易用的API,同时保持了优秀的性能表现,适合各种需要SM3哈希功能的Rust应用程序。

回到顶部