3个版本 (1个稳定版)
1.0.0 | 2024年3月16日 |
---|---|
0.1.1 | 2023年1月26日 |
0.1.0 | 2023年1月26日 |
在 加密学 中排名第568
每月下载量267次
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