dev_tool/
secure_util.rs

1use base64::{prelude::BASE64_STANDARD, DecodeError, Engine};
2use hmac::{Hmac, Mac};
3use sha1::Sha1;
4
5/// 加解密工具,摘要算法等也归集次此工具类中
6pub struct SecureUtil;
7
8impl SecureUtil {
9    /// 对字节数组进行Base64编码
10    ///
11    /// # 参数
12    /// * `bytes` - 需要编码的字节数组切片
13    ///
14    /// # 返回值
15    /// 返回编码后的Base64字符串
16    pub fn base64_encode(bytes: &[u8]) -> String {
17        BASE64_STANDARD.encode(bytes)
18    }
19
20    /// 对Base64编码的字符串进行解码
21    ///
22    /// # 参数
23    /// * `base64_str` - 需要解码的Base64编码字符串
24    ///
25    /// # 返回值
26    /// * `Ok(Vec<u8>)` - 解码成功,返回解码后的字节数据
27    /// * `Err(DecodeError)` - 解码失败,返回错误信息
28    ///
29    /// # 示例
30    /// ```
31    /// let decoded = base64_decode("SGVsbG8=").unwrap();
32    /// assert_eq!(decoded, b"Hello");
33    /// ```
34    pub fn base64_decode(base64_str: &str) -> Result<Vec<u8>, DecodeError> {
35        BASE64_STANDARD.decode(base64_str)
36    }
37
38    /// 使用HMAC-SHA1算法对数据进行签名
39    ///
40    /// 该函数接收待签名的数据和密钥,使用HMAC-SHA1算法生成数字签名。
41    ///
42    /// # 参数
43    /// * `data` - 待签名的字节数据切片
44    /// * `key` - 用于签名的密钥字符串
45    ///
46    /// # 返回值
47    /// 返回HMAC-SHA1签名结果的字节向量
48    ///
49    /// # Panics
50    /// 当密钥长度无效时会panic,但在实际中HMAC可以接受任意长度的密钥
51    pub fn hmac_sha1(data: &[u8], key: &str) -> Vec<u8> {
52        let key = key.as_bytes();
53        // 创建HMAC-SHA1实例并初始化
54        let mut hmac = Hmac::<Sha1>::new_from_slice(key).expect("HMAC can take key of any size");
55        // 更新HMAC状态,处理输入数据
56        hmac.update(data);
57        // 完成HMAC计算并获取结果
58        let result = hmac.finalize();
59        let hmac_bytes = result.into_bytes();
60        hmac_bytes.to_vec()
61    }
62
63    /// 将字节数组转换为MD5哈希字符串
64    ///
65    /// 该函数接收一个字节切片,计算其MD5哈希值,并将结果格式化为十六进制字符串。
66    ///
67    /// # 参数
68    /// * `bytes` - 需要计算MD5哈希的字节数据切片
69    ///
70    /// # 返回值
71    /// 返回表示MD5哈希值的十六进制字符串
72    ///
73    /// # 示例
74    /// ```
75    /// let data = b"hello world";
76    /// let md5_str = to_md5_str(data);
77    /// assert_eq!(md5_str, "5eb63bbbe01eeed093cb22bb8f5acdc3");
78    /// ```
79    pub fn to_md5_str(bytes: &[u8]) -> String {
80        // 计算输入数据的MD5哈希值
81        let data_md5 = md5::compute(bytes);
82        // 将MD5哈希值格式化为十六进制字符串
83        let md5_string = format!("{:x}", data_md5);
84        md5_string
85    }
86
87    /// 计算字节数组的MD5哈希值
88    ///
89    /// # 参数
90    /// * `bytes` - 需要计算MD5哈希值的字节数组切片
91    ///
92    /// # 返回值
93    /// 返回计算得到的MD5哈希值,以字节数组形式表示
94    ///
95    /// # 示例
96    /// ```
97    /// let data = b"hello world";
98    /// let hash = to_md5(data);
99    /// ```
100    pub fn to_md5(bytes: &[u8]) -> Vec<u8> {
101        // 使用md5库计算输入数据的哈希值并转换为Vec<u8>
102        let data_md5 = md5::compute(bytes).to_vec();
103        data_md5
104    }
105}
106
107#[cfg(test)]
108mod tests {
109
110    use super::*;
111
112    #[test]
113    fn test_base64() {
114        let bytes = "hello, rust!".as_bytes();
115        let base64_str = SecureUtil::base64_encode(bytes);
116        println!("{}", base64_str);
117    }
118}