#string #url-safe #integer #decryption #id #encryption #encoded-string

cryptid-rs

一个用于将整数ID加密和解码为URL安全字符串的库

2 个版本

0.1.1 2024年7月11日
0.1.0 2024年6月11日

#1103编码

Download history 137/week @ 2024-06-08 11/week @ 2024-06-15 89/week @ 2024-07-06 16/week @ 2024-07-13 5/week @ 2024-07-20 6/week @ 2024-07-27

每月55 次下载

MIT/Apache

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