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}