br_crypto/
hmac.rs

1use hmac::{Hmac, Mac};
2use sha1::Sha1;
3use sha2::Sha256;
4use sha1::Digest;
5
6type Hmac256 = Hmac<Sha256>;
7type Hmac1 = Hmac<Sha1>;
8use std::fmt::Write;
9/// SHA256
10pub fn sha256(key: &str, data: &str) -> String {
11    let mut mac = Hmac256::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
12    mac.update(data.as_bytes());
13    let result = mac.finalize();
14    let code = result.into_bytes();
15    // 优化:使用 `write!` 代替 `format!` 来构建字符串
16    let mut contents = String::with_capacity(code.len() * 2); // 预先分配足够的空间
17    for &byte in &code {
18        write!(&mut contents, "{byte:02x}").expect("Unable to write");
19    }
20    contents
21}
22/// SHA256
23pub fn sha256_u8(key: &str, data: &str) -> Vec<u8> {
24    let mut mac = Hmac256::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
25    mac.update(data.as_bytes());
26    let result = mac.finalize();
27    let code = result.into_bytes();
28    code.to_vec()
29}
30/// SHA1
31pub fn sha1(key: &str, data: &str) -> String {
32    let mut mac = Hmac1::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
33    mac.update(data.as_bytes());
34    let result = mac.finalize();
35    let code = result.into_bytes();
36    let mut contents = String::with_capacity(code.len() * 2); // 预先分配足够的空间
37    for &byte in &code {
38        write!(&mut contents, "{byte:02x}").expect("Unable to write");
39    }
40    contents
41}
42
43/// SHA1
44pub fn sha1_code(key: &str, data: &str) -> Vec<u8> {
45    let mut mac = Hmac1::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
46    mac.update(data.as_bytes());
47    let result = mac.finalize();
48    let code = result.into_bytes();
49    code.to_vec()
50}
51
52pub fn sha1_u8(key: &str, data: &str) -> Vec<u8> {
53    let mut mac = Hmac1::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
54    mac.update(data.as_bytes());
55    let result = mac.finalize();
56    let code = result.into_bytes();
57    code.to_vec()
58}
59
60pub fn sha_1(data: &str) -> Vec<u8> {
61    let mut hasher = Sha1::new();
62    hasher.update(data);
63    let result = hasher.finalize();
64    result.as_slice().to_vec()
65}