dev_tool/
secure_util.rs

1use base64::{prelude::BASE64_STANDARD, DecodeError, Engine};
2use hmac::{Hmac, Mac};
3use sha1::Sha1;
4use sha2::{Sha256, Digest};
5use crate::HexUtil;
6
7/// 加解密工具,摘要算法等也归集次此工具类中
8pub struct SecureUtil;
9
10impl SecureUtil {
11
12    /// TODO 待完善
13    pub fn aes_random_key() -> String {
14        "".to_string()
15    }
16
17    /// TODO 待完善
18    pub fn aes_encode(bytes: &[u8], key: &str) -> String {
19        "".to_string()
20    }
21
22    /// TODO 待完善
23    pub fn aes_decode(decode_str: &str, key: &str) -> Vec<u8> {
24        vec![]
25    }
26
27    /// TODO 待完善
28    pub fn rsa_random_key() -> (String, String) {
29        ("".to_string(), "".to_string())
30    }
31
32    /// TODO 待完善
33    pub fn rsa_encode() {
34
35    }
36
37    /// TODO 待完善
38    pub fn rsa_decode() {
39
40    }
41
42    /// 计算字节数组的SHA256哈希值并返回十六进制字符串
43    /// 
44    /// 固定生成256 位(32 字节) 的哈希值,以 64 位十六进制字符串形式展示
45    /// 
46    /// # 参数
47    /// * `bytes` - 需要计算哈希值的字节数组切片
48    /// 
49    /// # 返回值
50    /// 返回SHA256哈希值的十六进制字符串表示
51    pub fn sha256_string(bytes: &[u8]) -> String{
52        // 计算SHA256哈希值
53        let result = Sha256::digest(bytes);
54        let result = &result[..];
55        // 将哈希值转换为十六进制字符串
56        HexUtil::to_hex(result)
57    }
58
59    pub fn md5_string(bytes: &[u8]) -> String {
60        // 计算输入数据的MD5哈希值
61        let data_md5 = md5::compute(bytes);
62        // 将MD5哈希值格式化为十六进制字符串
63        let md5_string = format!("{:x}", data_md5);
64        md5_string
65    }
66
67    /// 对字节数组进行Base64编码
68    ///
69    /// # 参数
70    /// * `bytes` - 需要编码的字节数组切片
71    ///
72    /// # 返回值
73    /// 返回编码后的Base64字符串
74    pub fn base64_encode(bytes: &[u8]) -> String {
75        BASE64_STANDARD.encode(bytes)
76    }
77
78    /// 对Base64编码的字符串进行解码
79    ///
80    /// # 参数
81    /// * `base64_str` - 需要解码的Base64编码字符串
82    ///
83    /// # 返回值
84    /// * `Ok(Vec<u8>)` - 解码成功,返回解码后的字节数据
85    /// * `Err(DecodeError)` - 解码失败,返回错误信息
86    ///
87    /// # 示例
88    /// ```
89    /// let decoded = base64_decode("SGVsbG8=").unwrap();
90    /// assert_eq!(decoded, b"Hello");
91    /// ```
92    pub fn base64_decode(base64_str: &str) -> Result<Vec<u8>, DecodeError> {
93        BASE64_STANDARD.decode(base64_str)
94    }
95
96    /// 使用HMAC-SHA1算法对数据进行签名
97    ///
98    /// 该函数接收待签名的数据和密钥,使用HMAC-SHA1算法生成数字签名。
99    ///
100    /// # 参数
101    /// * `data` - 待签名的字节数据切片
102    /// * `key` - 用于签名的密钥字符串
103    ///
104    /// # 返回值
105    /// 返回HMAC-SHA1签名结果的字节向量
106    ///
107    /// # Panics
108    /// 当密钥长度无效时会panic,但在实际中HMAC可以接受任意长度的密钥
109    pub fn hmac_sha1(data: &[u8], key: &str) -> Vec<u8> {
110        let key = key.as_bytes();
111        // 创建HMAC-SHA1实例并初始化
112        let mut hmac = Hmac::<Sha1>::new_from_slice(key).expect("HMAC can take key of any size");
113        // 更新HMAC状态,处理输入数据
114        hmac.update(data);
115        // 完成HMAC计算并获取结果
116        let result = hmac.finalize();
117        let hmac_bytes = result.into_bytes();
118        hmac_bytes.to_vec()
119    }
120
121    /// 将字节数组转换为MD5哈希字符串
122    ///
123    /// 该函数接收一个字节切片,计算其MD5哈希值,并将结果格式化为十六进制字符串。
124    ///
125    /// # 参数
126    /// * `bytes` - 需要计算MD5哈希的字节数据切片
127    ///
128    /// # 返回值
129    /// 返回表示MD5哈希值的十六进制字符串
130    ///
131    /// # 示例
132    /// ```
133    /// let data = b"hello world";
134    /// let md5_str = to_md5_str(data);
135    /// assert_eq!(md5_str, "5eb63bbbe01eeed093cb22bb8f5acdc3");
136    /// ```
137    #[deprecated(note = "This function is deprecated, please use md5_string instead")]
138    pub fn to_md5_str(bytes: &[u8]) -> String {
139        Self::md5_string(bytes)
140    }
141
142    /// 计算字节数组的MD5哈希值
143    ///
144    /// # 参数
145    /// * `bytes` - 需要计算MD5哈希值的字节数组切片
146    ///
147    /// # 返回值
148    /// 返回计算得到的MD5哈希值,以字节数组形式表示
149    ///
150    /// # 示例
151    /// ```
152    /// let data = b"hello world";
153    /// let hash = to_md5(data);
154    /// ```
155    pub fn to_md5(bytes: &[u8]) -> Vec<u8> {
156        // 使用md5库计算输入数据的哈希值并转换为Vec<u8>
157        let data_md5 = md5::compute(bytes).to_vec();
158        data_md5
159    }
160}
161
162#[cfg(test)]
163mod tests {
164
165    use super::*;
166
167    #[test]
168    fn test_base64() {
169        let bytes = "hello, rust!".as_bytes();
170        let base64_str = SecureUtil::base64_encode(bytes);
171        println!("{}", base64_str);
172    }
173
174    #[test]
175    fn test_sha256() {
176        let sha256_string = SecureUtil::sha256_string(b"hello world");
177        println!("{}", sha256_string);
178        assert_eq!(sha256_string, "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9");
179    }
180}