You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:10