5 个版本 (稳定)
1.0.4 | 2024年4月16日 |
---|---|
1.0.1 | 2024年4月15日 |
0.1.40 | 2024年4月15日 |
#5 在 #encrypt-decrypt
每月下载量 32 次
31KB
115 行
encrypt_secret
用于加密/解密秘密的库
版本: 1.0.4 日期: 2024-04-16 作者: bestia.dev 仓库: GitHub
标签: #rustlang 我的GitHub项目更像教程而不是成品: bestia-dev 教程.
秘密
当我们编写应用程序时,与任何服务器的每个连接都需要与秘密一起工作:密码、密钥、密码、密码短语、API令牌等等。
有时让用户输入密码是完全可以接受的。密码对人类来说容易记住和输入。但它们是最不安全的。
拥有一个像API令牌那样的长随机“密钥”字符串会更好,但没有人类能够记住它。这意味着我们需要将其存储在某个地方。
理论上,仅使用软件来100%安全地存储此秘密是不可能的。现代计算机使用特殊的芯片来处理。但我们可以让攻击者获取秘密变得困难和不明显。
GitHub API令牌
GitHub API令牌就像密码一样是一个秘密。也许更大。
有了这个API令牌,恶意行为者可以基本上更改您GitHub账户中的任何内容。您不希望这样。
如何保护这个秘密?
好吧,这里有一些基本建议
- 给予API令牌最少的权限/授权,以最大限度地减少攻击者可能造成的损害
- 频繁过期令牌,这样旧令牌就毫无用处
- HTTPS是理所当然的。永远不要再使用HTTP。它在线上是纯文本。
- 永远不要将令牌以纯文本形式存储在文件中
- 环境变量中的纯文本也可以被恶意软件访问
对称加密
我们将使用加密 aes_gcm::Aes256Gcm 对像API令牌这样的非常短的字符串。所以我认为性能不是问题。
我们使用32字节的密码来加密字符串。
我们也可以输入一个字符串密码,它将内部散列成一个32字节的密码。
使用SSH密钥加密令牌
由于Git和SSH连接到Web服务器,我们习惯于使用SSH密钥。
我们已经知道如何创建、保护和管理工作密钥。我们对私钥和公钥都很了解。
我们知道私钥由密码短语保护。
我们已经知道如何将SSH密钥添加到ssh-agent中。我们知道使用ssh-agent使生活变得更容易,但它有一些安全顾虑。在大多数情况下,这不是关键,但你必须自己平衡便利性和安全性。
由于在Rust中开发的工作流程,所有这些知识都已经掌握。
我们可以使用同样的技术来加密API令牌。
我们将使用私钥签署一个随机种子,并将结果作为新的超级秘密密码。获取这个超级秘密密码的唯一方法是使用私钥签署种子。我们假设只有所有者才能使用其私钥进行签名。这是SSH密钥安全的基础。
超级秘密密码将用于对称加密令牌,并以文本形式写入文件。与文本文件一起工作要简单得多。
永远不要将秘密提交到您的存储库。GitHub会定期扫描上传的秘密。这是绝对不允许的。我更喜欢将加密的令牌存储在~/.ssh
目录中,靠近其他秘密和加密密钥。
创建SSH密钥
建议为每个API令牌加密其专用的SSH密钥。这样,您可以细粒度地控制其使用方式。
ssh-keygen -t ed25519 -C "github api token"
# for test type these interactively:
# file name: tests/test_github_api_token_ssh_1
# passphrase: test_passphrase
# repeat passphrase: test_passphrase
便利性与安全性之间的平衡
首先,理论上不可能仅通过软件100%地保护秘密。如果攻击者获得了对计算机的特权和物理访问权限,他们可以做任何事情。但这并不意味着这很容易和很快。我们可以使寻找秘密变得更加困难。最后,我们必须在便利性和安全性之间做出选择。
您可以选择每次都在终端中输入API密钥。这非常不方便。您无法记住API密钥,您必须在计算机上某处存储它。然后使用复制粘贴。这同样是一个安全问题。这个秘密令牌将保留在剪贴板中,很容易提取。
永远不要将秘密令牌以纯文本形式存储。无论是文件还是环境变量。文件和环境变量很容易上传到恶意网站。使用某种类型的秘密管理器或加密。
当令牌使用SSH加密时,必须使用私钥进行解密。私钥由密码短语保护。这个密码短语很容易记住和输入。您可以选择在每次使用令牌时输入密码短语。这是相当安全的,但不太方便。
最终,您可以使用ssh-agent仅输入一次密码短语来解密私钥。它将在后台工作一段时间,例如1小时或直到终端会话结束。这不是安全的,因为攻击者可以使用相同的开源代码以未加密的形式从ssh-agent中提取令牌。但这很复杂,并且有时间限制。
只是提一下,令牌可能在使用时从内存中提取。或者,攻击者可以安装键盘记录器并将所有输入的密码和密码短语发送到恶意网站。一旦攻击者获得足够的权限,软件漏洞就没有限制了。
最后,您的选择。
开源和免费如啤酒
我的开源项目免费如啤酒(MIT许可证)。
我只是喜欢编程。
但我也需要喝酒。如果您觉得我的项目和教程有帮助,请通过向我PayPal捐款来为我买一杯啤酒。
您知道您当地酒吧啤酒的价格 ;-)
所以我可以为了您的健康喝一杯免费的啤酒 :-)
Na zdravje! Alla salute! Prost! Nazdravlje! 🍻
//bestia.dev
//github.com/bestia-dev
//bestiadev.substack.com
//youtube.com/@bestia-dev-tutorials
依赖项
~12–22MB
~295K SLoC