2 个版本
0.1.1 | 2024年7月11日 |
---|---|
0.1.0 | 2024年6月11日 |
#1103 在 编码
每月55 次下载
30KB
449 行
Cryptid-rs
Cryptid-rs 是一个库,用于安全地将整数(如数据库主键)编码和解码为字符串及其反向操作。编码的字符串格式受 Stripe 的 API 启发。
例如,用户 ID 123
可能会被编码为 user_hHLBCl4rZ3u
。
优点
- 类型安全:编码字符串携带前缀,防止不同类型的 ID 发生混淆。
- 短:与 UUID 相比,cryptid 字符串默认较短:11 个字符加上类型前缀。
- 适用于整数数据库键:如果您使用整数作为数据库主键但不想在您的 API 中直接暴露它们,此库非常适合。
- 不可猜测:cryptid 被加密,使它们不仅被隐藏,而且不可猜测。
- Serde 和 Diesel 支持:定义泛型类型,这些类型可以直接与 Serde 和 Diesel 一起使用,以便在您的 API 或数据库层中透明地编码和解码标识符。
根据您的需求,这些优点可能也有缺点。请仔细考虑,与使用 UUID 作为数据库键等解决方案相比,此库是否是您的正确选择。
示例
使用泛型 Field
类型来定义您在公共 API 中公开的每种类型的类型。该 Field
类型支持与 Diesel 和 Serde 的自动编码和解码。
use cryptid_rs_rs;
use serde::{Serialize, Deserialize};
use serde_json;
// Define the ExampleId cryptid field type. The type marker defines the string prefix.
#[derive(Debug)]
pub struct ExampleIdMarker;
impl cryptid_rs::TypeMarker for ExampleIdMarker {
fn name() -> &'static str { "example" }
}
type ExampleId = cryptid_rs::Field<ExampleIdMarker>;
// The field can then be used in structs, and works automatically with Serde and Diesel.
#[derive(serde::Serialize)]
struct Example {
pub id: ExampleId,
}
cryptid_rs::Config::set_global(cryptid_rs::Config::new(b"your-secure-key"));
let obj = Example {id: ExampleId::new(12345)};
let obj_str = serde_json::to_string(&obj).unwrap();
assert_eq!(obj_str, "{\"id\":\"example_VgwPy6rwatl\"}");
加密是什么?
加密使用 格式保留加密 (FPE),与 AES (FF1 with AES256) 和 HMAC (SHA256) 用于完整性检查。
默认情况下,HMAC 被截断为 4 个字节,这对于通过速率限制的 API 来说足够大,无法猜测,但仍然使字符串相对较短。对于高安全性的应用程序,请考虑使用更长的 HMAC。
依赖项
~5.5MB
~109K SLoC