#cookies #security #encryption #signing #signed #secure #header

simple-cookie

创建和解析签名和加密cookie的函数

3个版本 (1个稳定版)

1.0.0 2024年3月16日
0.1.1 2023年1月26日
0.1.0 2023年1月26日

加密学 中排名第568

Download history 9/week @ 2024-04-22 38/week @ 2024-04-29 11/week @ 2024-05-20 7/week @ 2024-05-27 5/week @ 2024-06-03 12/week @ 2024-06-10 29/week @ 2024-06-24 15/week @ 2024-07-08 8/week @ 2024-07-15 60/week @ 2024-07-22 99/week @ 2024-07-29 100/week @ 2024-08-05

每月下载量267

MIT许可协议

17KB
155

创建和解析签名和加密cookie的函数。

cookie crate是Rust中事实上的安全cookie库。它对我来说太复杂了(TM)。(在我看来,对大多数人来说也是如此。)这是20%的努力的80%解决方案。

这个库只有两个目标

  • 签名、加密、解密和验证cookie的简单、易于审计的实现。
  • 清晰的注释指出安全问题,并描述如何避免这些问题。

这个库的目标不是

  • 自动检测何时需要新的Set-Cookie头。
  • 跟踪cookie的变化。
  • 验证cookie名称是否符合RFC6265。 (只是不要使用任何奇怪的cookie名称。)
  • 任何类型的cookie "jar"功能。
  • 实际上任何事情。

示例

基本使用

use simple_cookie::{generate_signing_key, encode_cookie, decode_cookie};

let signing_key = generate_signing_key();
let encoded = encode_cookie(&signing_key, "account_id", &[56]);
let decoded = decode_cookie(&signing_key, "account_id", encoded);

assert_eq!(decoded, Some(vec![56]));

你可能需要一个实际的Set-Cookie头。你可以很容易地构建一个

use simple_cookie::{generate_signing_key, encode_cookie};

let signing_key = generate_signing_key();
let encoded = encode_cookie(&signing_key, "account_id", &[56]);
let header = format!("Set-Cookie: session={}; Max-Age=604800; Secure; HttpOnly; SameSite=Strict", encoded);

然后,为了解密一个头

use simple_cookie::{parse_cookie_header_value, decode_cookie};

// You can create your own key or load it from somewhere.
// Don't use all zeros like this though. See the documentation for SigningKey for more info.
let signing_key = [0; 32];

// This is a standard HTTP Cookie header, pretty much exactly what the browser sends to your server.
let header = b"Cookie: session=gNm1wQ6lTTgAxLxfD2ntNS2nIBVcnjSmI+7FdFk; another-cookie=another-value";

// parse_cookie_header_value doesn't expect the header name.
// You don't normally need this step since HTTP libraries typically automatically parse
// the header name & value into separate parts of a tuple or struct or something.
let header = &header[8..];

// parse_cookie_header_value returns an iterator, so you can use it in a for loop or something.
// I'll just find the cookie we're interested in here.
let (name, encoded_value) = parse_cookie_header_value(header).find(|(name, _value)| *name == "session").unwrap();
let value = decode_cookie(&signing_key, name, encoded_value);

assert!(value.is_some())

依赖关系

~1.5MB
~26K SLoC