4个稳定版本

1.1.7 2024年4月23日
1.0.7 2024年4月17日

#97 in 配置


3 个crates中使用

MIT 许可证

32KB
115

cargo_auto_encrypt_secret_lib

用于加密/解密密钥的库
版本:1.1.7 日期:2024-04-23 作者: bestia.dev 仓库: GitHub

rust maintained ready_for_use

crates.io Documentation Lib.rs License Rust Hits

Lines in Rust code Lines in Doc comments Lines in Comments Lines in examples Lines in tests

标签:#rustlang 我在GitHub上的项目更像是教程而不是成品: bestia-dev教程.

密钥

当我们编写应用程序时,与任何服务器的每个连接都需要与密钥(密码、密钥、密码、密钥短语、API secret_tokens等)一起工作。

有时让用户输入密码就足够了。密码对人类来说容易记住和输入。但它们是最不安全的。

有长随机的"密钥"字符串(如API secret_token)会更好,但没有人类能够记住它。这意味着我们需要将其存储在某个地方。

理论上,仅使用软件无法100%安全地存储此密钥。现代计算机使用特殊芯片来完成这项工作。但我们可以使攻击者难以获得密钥。

GitHub API secret_token

GitHub API secret_token就像密码一样是一个密钥。也许更大。
有了这个API secret_token,恶意行为者可以基本上更改您GitHub账户中的任何内容。您不希望这样。

如何保护这个密钥?
好的,有一些基本建议

  • 给API secret_token最少的权限/授权,以最大限度地减少攻击者可能造成的损害
  • 频繁使secret_token过期,因此旧的secret_tokens将不再有用
  • HTTPS是毫无疑问的。永远不要再使用HTTP。它是在线上的纯文本。
  • 永远不要将secret_token以纯文本形式存储在文件中
  • 环境变量中的纯文本也可以被恶意软件访问

对称加密

我们将使用加密 aes_gcm::Aes256Gcm 来加密非常短的字符串,如API secret_tokens。所以我假设性能不是问题。
我们使用32字节的密码来加密一个字符串。
我们还可以输入一个字符串密码,它将内部散列成一个32字节的密码。

使用SSH密钥加密secret_token

由于Git和SSH连接到Web服务器,我们习惯于使用SSH密钥。
我们已经知道如何创建、保护和管理工作站密钥。我们对私钥和公钥都很了解。
我们知道私钥是通过密码保护的。
我们已经知道如何将SSH密钥添加到ssh-agent中。我们也知道使用ssh-agent可以使生活更轻松,但这也带来了一些安全顾虑。在大多数情况下,这并不是关键问题,但你必须自己权衡便利性和安全性。
由于在Rust开发中的工作流程,我们已经掌握了所有这些知识。
我们可以使用同样的技术来加密API的secret_token。

我们将使用私钥对随机种子进行签名,结果将是一个新的超级密钥。获取这个超级密钥的唯一方式是使用私钥对种子进行签名。我们假设只有所有者才能用自己的私钥进行签名。这就是SSH密钥安全的基础。

这个超级密钥将用于对称加密secret_token并将其以文本形式写入文件。与文本文件相比,这要简单得多。

永远不要将秘密提交到您的存储库。GitHub会定期扫描上传的秘密。这是大忌。我更喜欢将加密的secret_token存储在靠近其他秘密和加密密钥的~/.ssh目录中。

创建SSH密钥

建议为每个API secret_token使用其专用SSH密钥进行加密。这样,您可以更细致地控制其使用方式。

ssh-keygen -t ed25519 -C "github api secret_token"
# for test type these interactively:
# file name: tests/test_github_api_secret_token_ssh_1
# passphrase: test_passphrase
# repeat passphrase: test_passphrase

便利性与安全性之间的平衡

首先,理论上使用软件完全保护秘密是不可能的。如果攻击者获得了对计算机的特权或物理访问权限,他们可以做到任何事情。但这并不意味着这很容易且迅速。我们可以让它更难找到秘密。最终,我们必须在便利性和安全性之间做出选择。

您可以选择每次都输入API密钥。这非常不方便。您可能无法记住API密钥,您必须在计算机上某个地方将其存储下来,然后使用复制粘贴。这也是一个安全顾虑。这个secret_token将留在剪贴板上,很容易被提取。

永远不要将secret_token以纯文本形式存储。无论是在文件中还是在环境变量中。文件和环境变量很容易被上传到恶意网站。使用某种类型的秘密管理器或加密。

当secret_token使用SSH加密时,必须使用私钥进行解密。私钥通过密码保护。这个密码很容易记住和输入。您可以选择在每次使用secret_token时输入密码。这非常安全但不太方便。

最终,您可以使用ssh-agent仅输入密码一次来解密私钥。它将在后台工作一段时间,例如1小时或直到终端会话结束。这并不安全,因为攻击者可以使用相同的开源代码从ssh-agent中提取未加密的secret_token。但这很复杂,并且有时间限制。

只是提一下,secret_token在使用时可能会从内存中提取。或者攻击者可以安装键盘记录器,并将所有输入的密码和密码发送到恶意网站。一旦攻击者获得足够的权限,软件攻击就没有限制了。

最后,您的选择。

免费如啤酒的开源软件

我的开源项目免费如啤酒(MIT许可证)。
我真的很喜欢编程。
但我也需要喝。如果您觉得我的项目和教程有帮助,请通过向我的PayPal捐款来买我一杯啤酒。
您知道您当地酒吧啤酒的价格:-)
这样我就可以为您的健康喝一杯免费的啤酒了:-)
Na zdravje! Alla salute! Prost! Nazdravlje! 🍻

//bestia.dev
//github.com/bestia-dev
//bestiadev.substack.com
//youtube.com/@bestia-dev-tutorials

依赖项

~12–21MB
~285K SLoC