3 个版本 (重大变更)
0.7.0 | 2024年1月5日 |
---|---|
0.2.0 | 2022年9月28日 |
0.1.0 | 2022年5月11日 |
在 加密学 中排名 352
每月下载量 1,840
在 16 个 crate 中使用(直接使用6个)
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数据,则用户需要确保
- 单个值被分块,否则解密可能容易受到拒绝服务攻击。
StoreCipher
定期轮换/重新加密。
WASM 支持
此crate依赖于random
和getrandom
crate,这些crate不支持WASM自动。
可以直接在这份crate上开启 js
功能,或者依赖 getrandom
并开启 js
功能。更多信息可以在 getrandom
文档 中找到。
依赖项
~3.5–5MB
~110K SLoC