#security-framework #key-store #security #hsm

animo-secure-env

secure-env 是一个围绕 Android KeyStore 和 iOS 安全框架的包装库,用于使用安全元素进行密钥创建和签名操作

11 个版本 (4 个破坏性更新)

0.5.0 2024 年 7 月 25 日
0.4.0 2024 年 6 月 4 日
0.3.3 2024 年 5 月 22 日
0.2.2 2024 年 5 月 8 日
0.1.1 2024 年 4 月 25 日

#707密码学

Download history 359/week @ 2024-05-03 86/week @ 2024-05-10 581/week @ 2024-05-17 83/week @ 2024-05-24 279/week @ 2024-05-31 121/week @ 2024-06-07 17/week @ 2024-06-14 1/week @ 2024-06-21 134/week @ 2024-06-28 96/week @ 2024-07-05 19/week @ 2024-07-12 157/week @ 2024-07-19 109/week @ 2024-07-26 9/week @ 2024-08-02 11/week @ 2024-08-09 323/week @ 2024-08-16

每月 560 次下载

Apache-2.0

43KB
783

Android 和 iOS 的安全元素库

secure-env 是一个库,允许使用移动安全元素进行密钥生成和签名创建。

支持的目标

  • aarch64-apple-ios
  • aarch64-apple-ios-sim
  • x86_64-apple-ios
  • aarch64-linux-android
  • armv7-linux-androideabi
  • i686-linux-android
  • x86_64-linux-android

iOS

iOS 绑定是通过 security-framework 完成的。这是一个围绕 Apple 的 security.framework 的安全包装。

Android

Android 绑定是通过 jni-rs 完成的。曾讨论过通过 IPC (Binder) 或 HIDL 来实现,但最终选择了 jni,因为它更简单且文档齐全。

在这些绑定下面,它完全依赖于 KeyStore。在密钥生成过程中,根据支持版本,将 setIsStrongBoxBacked 设置为确保密钥存储在硬件中。如果不支持,则回退到较低的安全级别 setUserPresenceRequired

注意:还需要进行一些额外的研究来确定 setUserPresenceRequired 提供的确切保证。如果这意味着 TEE,那么就很好。

额外设置

由于时间限制,目前需要一些额外的设置才能在 Android 上完全工作。这涉及到从 Rust 访问 JVM 指针。如果使用了 android_activity,请查看 android 示例。如果从这个库中使用了 React Native 上下文或原生 Android 应用,请在您的项目中包含以下内容

package id.animo;

public class SecureEnvironment {
    static {
        System.loadLibrary("secure_env");
    }


    public static native void set_env();
}

之后,您可以在调用库之前调用 SecureEnvironment.set_env。之后一切应该都设置正确。

功能

ios android
生成密钥对
通过 ID 获取密钥对
获取公钥
签名

用法

添加依赖关系

cargo add secure-env
// src/main.rs
use secure_env::{SecureEnvironment, SecureEnvironmentOps, Key, KeyOps};

fn main() {
    let key = SecureEnvironment::generate_keypair("my-key-id").unwrap();
    let key_from_id = SecureEnvironment::get_keypair_by_id("my-key-id").unwrap();

    let msg = b"Hello World!";

    let public_key = key.get_public_key().unwrap();
    let signature = key.sign(msg).unwrap();

    assert!(public_key.len(), 33);
    assert!(signature.len(), 64);
}

依赖关系

~2–15MB
~153K SLoC