3 个版本 (重大变更)

0.7.0 2024年1月5日
0.2.0 2022年9月28日
0.1.0 2022年5月11日

加密学 中排名 352

Download history 520/week @ 2024-04-20 504/week @ 2024-04-27 548/week @ 2024-05-04 586/week @ 2024-05-11 631/week @ 2024-05-18 522/week @ 2024-05-25 455/week @ 2024-06-01 381/week @ 2024-06-08 576/week @ 2024-06-15 477/week @ 2024-06-22 317/week @ 2024-06-29 248/week @ 2024-07-06 443/week @ 2024-07-13 518/week @ 2024-07-20 449/week @ 2024-07-27 404/week @ 2024-08-03

每月下载量 1,840
16 crate 中使用(直接使用6个)

Apache-2.0

34KB
348

适用于键/值存储的一般加密方案。

使用方法

use matrix_sdk_store_encryption::StoreCipher;
use serde_json::{json, value::Value};

fn main() -> anyhow::Result<()> {
    let store_cipher = StoreCipher::new()?;

    // Export the store cipher and persist it in your key/value store
    let export = store_cipher.export("secret-passphrase")?;

    let value = json!({
        "some": "data",
    });

    let encrypted = store_cipher.encrypt_value(&value)?;
    let decrypted: Value = store_cipher.decrypt_value(&encrypted)?;

    assert_eq!(value, decrypted);

    let key = "bulbasaur";

    // Hash the key so people don't know which pokemon we have collected.
    let hashed_key = store_cipher.hash_key("list-of-pokemon", key.as_ref());
    let another_table = store_cipher.hash_key("my-starter", key.as_ref());
    let same_key = store_cipher.hash_key("my-starter", key.as_ref());

    assert_ne!(key.as_ref(), hashed_key);
    assert_ne!(hashed_key, another_table);
    assert_eq!(another_table, same_key);

    Ok(())
}

⚠️ 安全警告:危险物品!

此crate仅实现低级块加密功能,仅用作构建更高层结构的构建块。它不适用于直接在应用程序中使用。

自行承担风险!

加密方案

加密方案的核心组件是StoreCipher类型,用于混淆键和加密键/值存储的值。StoreCipher对象由两个随机生成的32字节密钥组成。

第一个密钥用于加密值。使用随机nonce的XChaCha20Poly1305加密每个值。nonce与密文一起保存。

第二个密钥用作种子,以派生特定于表的密钥,用于密钥化哈希构造,该构造反过来用于哈希表数据。目前我们使用blake3作为密钥化哈希构造。

                ┌───────────────────────────────────────┐
                │             StoreCipher               │
                │   Encryption key |    Hash key seed   │
                │      [u8; 32]    |       [u8; 32]     │
                └───────────────────────────────────────┘

StoreCipher中内置了Matrix特定的假设,这确保了密码学原语的限制不会被超出。如果此crate用于非Matrix数据,则用户需要确保

  1. 单个值被分块,否则解密可能容易受到拒绝服务攻击。
  2. StoreCipher定期轮换/重新加密。

WASM 支持

此crate依赖于randomgetrandomcrate,这些crate不支持WASM自动。

可以直接在这份crate上开启 js 功能,或者依赖 getrandom 并开启 js 功能。更多信息可以在 getrandom 文档 中找到。

依赖项

~3.5–5MB
~110K SLoC