dev_tool/secure_util.rs
1// 加解密工具
2use base64::{prelude::BASE64_STANDARD, DecodeError, Engine};
3use hmac::{Hmac, Mac};
4use sha1::{Digest, Sha1};
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}