rust-crypto arm64链接错误及迁移至RustCrypto的密钥持久化问题
问题解决:rust-crypto链接错误与RustCrypto密钥持久化
一、解决arm64架构下的rust-crypto链接错误
rust-crypto 0.2版本已停止维护多年,其内部fixed_time_eq函数依赖的汇编实现未适配arm64架构,导致链接时出现_rust_crypto_util_fixed_time_eq_asm符号缺失错误。
临时修复方案
若需临时维持原有代码运行,可在Cargo.toml中禁用rust-crypto的默认汇编特性,改用纯Rust实现:
[dependencies] crypto = { version = "^0.2", default-features = false } rand = "0.8.5"
注意:这仅为临时 workaround,rust-crypto存在未修复的安全漏洞,建议尽快迁移到RustCrypto生态库。
二、RustCrypto中SigningKey/VerifyingKey的持久化
RustCrypto生态的ed25519 crate完全兼容原rust-crypto的密钥字节格式,可直接将密钥转换为[u8]数组存入数据库,步骤如下:
1. 添加依赖
在Cargo.toml中引入RustCrypto的ed25519实现:
[dependencies] ed25519 = "1.5" rand = "0.8.5"
2. 密钥与字节数组的互转
- SigningKey(私钥):通过
to_bytes()方法转为[u8; 64](与原rust-crypto私钥格式完全一致),从字节数组恢复用SigningKey::from_bytes()。 - VerifyingKey(公钥):通过
to_bytes()方法转为[u8; 32](与原rust-crypto公钥格式完全一致),从字节数组恢复用VerifyingKey::from_bytes()(返回Result,需处理错误)。
3. 迁移后的测试代码
对应原测试逻辑的迁移版本:
#[cfg(test)] mod test { use ed25519::{SigningKey, VerifyingKey}; use rand::RngCore; use rand::rngs::OsRng; #[test] fn test_signature() { // 生成32字节种子,与原rust-crypto的key逻辑一致 let mut ed25519_seed: [u8; 32] = [0; 32]; OsRng.fill_bytes(&mut ed25519_seed); // 生成密钥对 let signing_key = SigningKey::from_seed(&ed25519_seed); let verifying_key = signing_key.verifying_key(); // 持久化:转换为字节数组存入数据库 let secret_key_bytes: [u8; 64] = signing_key.to_bytes(); let public_key_bytes: [u8; 32] = verifying_key.to_bytes(); // 从字节数组恢复密钥 let restored_signing_key = SigningKey::from_bytes(&secret_key_bytes); let restored_verifying_key = VerifyingKey::from_bytes(&public_key_bytes).unwrap(); // 签名与验签验证 let message = b"test"; let signature = restored_signing_key.sign(message); assert!(restored_verifying_key.verify(message, &signature).is_ok()); } }
兼容性说明
原rust-crypto生成的64字节私钥、32字节公钥可直接通过SigningKey::from_bytes()和VerifyingKey::from_bytes()恢复,无需格式转换,完美兼容原有存储逻辑。
内容的提问来源于stack exchange,提问作者tanmoy
相关产品推荐
相关产品推荐

