如何在Rust中实现类似Python secrets.token_hex的加密安全随机十六进制?
在Rust中生成加密安全的随机十六进制字符串
当然有,Rust可以通过rand和hex这两个常用crate实现和Python secrets.token_hex(n)几乎一致的功能,核心是使用操作系统提供的加密安全随机数生成器来确保随机性的安全性。
步骤1:添加依赖
在你的Cargo.toml中加入以下依赖:
[dependencies] rand = "0.8" # 提供加密安全的随机数生成器 hex = "0.4" # 负责将字节转换为十六进制字符串
步骤2:实现类似token_hex的功能
下面是对应你Python示例的Rust代码,生成8字节(16位十六进制)的随机字符串:
use rand::rngs::OsRng; use rand::RngCore; use hex::encode; fn main() { // 生成8字节的随机数据 let mut bytes = [0u8; 8]; OsRng.fill_bytes(&mut bytes); // 转换为十六进制字符串 let xxx = encode(&bytes); println!("{}", xxx); }
如果你想封装成更接近Python的函数形式,可以这么写:
use rand::rngs::OsRng; use rand::RngCore; use hex::encode; // 输入字节数n,返回2n位的十六进制字符串 fn token_hex(n: usize) -> String { let mut bytes = vec![0u8; n]; OsRng.fill_bytes(&mut bytes); encode(&bytes) } fn main() { let xxx = token_hex(8); println!("{}", xxx); }
关键说明
OsRng是Rust标准生态中推荐的加密安全随机数生成器,底层会调用对应平台的安全API(比如Linux的/dev/urandom、Windows的CryptGenRandom),和Pythonsecrets模块的安全性一致。fill_bytes方法会将随机字节填充到指定的缓冲区中,缓冲区的长度就是你传入的字节数n。hex::encode会把字节数组转换成十六进制字符串,长度是字节数的2倍,和secrets.token_hex的输出规则完全匹配。
内容的提问来源于stack exchange,提问作者Slow but learning
相关产品推荐
相关产品推荐

