4 个版本 (2 个重大变更)
0.5.0 | 2022年9月3日 |
---|---|
0.4.0 |
|
0.3.2 |
|
0.2.1 | 2022年9月2日 |
0.1.0 | 2022年9月1日 |
#601 在 构建工具
每月下载量 1,028
10KB
envcrypt
envcrypt 是 env!
和 option_env!
的嵌入替换,在编译时加密变量,在运行时解密。
虽然仍然可以逆向工程值,但 envcrypt
阻止 strings <my-binary>
试图找到嵌入的秘密。更多信息请参见 详情。
用法
envc!
和 option_envc!
宏可以作为 env!
和 option_env!
的直接替换使用。
作为 env!
的替换
use envcrypt::envc;
let my_super_secret_key: &'static str = envc!("SECRET_KEY");
// ...do stuff with your secret key
作为 option_env!
的替换
use envcrypt::option_envc;
if let Some(optional_value) = option_envc!("OPTIONAL_SECRET_KEY") {
// ...do stuff
}
与 dotenvy
一起使用
.env
:
CLIENT_SECRET="my_client_secret"
SOME_TOKEN="some_token"
build.rs
:
use dotenvy::dotenv_iter;
fn main(){
println!("cargo:rerun-if-changed=.env");
for item in dotenv_iter().unwrap() {
let (key, value) = item.unwrap();
println!("cargo:rustc-env=${key}=${value}");
}
}
main.rs
:
use envcrypt::envc;
let client_secret: &'static str = envc!("CLIENT_SECRET");
详情
加密功能由 RustCrypto
提供,使用 ChaCha20Poly1305 加密。
虽然这是一个安全的算法,但它的使用方式非常不安全,因此不适合需要真正加密安全性的用例。《code>envcrypt通过在编译时加密环境变量,然后将加密的变量和加密密钥嵌入到您的二进制文件中来实现。
这意味着黑客仍然可以解密您的机密信息,但不像运行strings
那样简单。
这里有一个类比:与其让您的前门敞开(在二进制文件中嵌入裸字符串),不如关闭并锁上门,把钥匙放在地毯下(嵌入加密密钥)。罪犯仍然可以轻易地闯入您的房子,但仅仅是关闭和锁上门就足以阻止大多数人。
您可以通过在编译后的输出上运行strings
来检查您的机密信息是否在二进制文件中可见
$ cat envcrypt-test/src/main.rs
use envcrypt::envc;
fn main() {
println!("{}", envc!("ENCRYPTED_KEY"));
println!("{}", env!("NAKED_KEY"));
}
$ cat envcrypt-test/build.rs
fn main() {
println!("cargo:rustc-env=ENCRYPTED_KEY=ENCRYPTED_VALUE");
println!("cargo:rustc-env=NAKED_KEY=NAKED_VALUE");
}
$ cargo build -p envcrypt-test
Compiling envcrypt v0.2.0 (path/to/envcrypt)
Compiling envcrypt-test v0.0.0 (path/to/envcrypt/envcrypt-test)
Finished dev [unoptimized + debuginfo] target(s) in 1.73s
$ strings - target/debug/envcrypt-test | rg VALUE
NAKED_VALUE
依赖项
~1MB
~16K SLoC