如果您在日志/历史记录中有密码,为什么不首先修复记录/存储它的错误?
否则,您可能想要一些不同的东西:
一种密码散列方案,如PBKDF2
,等bcrypt
,argon2
以安全的方式存储密码并与一些用户输入进行比较。当您需要在服务器端使用密码实现某种身份验证时,通常会出现这种情况。
像 AES 一样的密码加密和保护方案。您需要密码才能自动对某些服务进行身份验证,并且它需要某种形式的明文密码。
您有一些秘密数据,需要以非明文形式安全地存储。
如果您有案例 1,请不要使用该aes
软件包,它是适合该工作的错误工具。如果您有案例 2,该aes
软件包可能会对您有所帮助,但您只是将保持密码保密的问题与保持密钥保密的另一个问题交换了(不是一个巨大的胜利)。因此,唯一可行aes
的选择可能是 3。
假设您需要以可逆方式存储一些秘密数据,例如上面的案例 3。
AES 有几种可能的操作模式,常见的有ECB
, CBC
, OFB
, GCM
, CTR
. Tcllib 包只支持ECB
and CBC
,并且只有CBC
(这是默认的)是一个真正可以使用的选项。请访问Wikipedia了解为什么您永远不应该使用ECB
模式的示例。
现在回到你的实际问题:
初始化向量 (IV)
这是您为每次加密选择的随机值,它不是秘密,您可以将其与加密数据一起发布。选择一个随机 IV 有助于使两个加密块不同,即使您使用相同的密钥和明文。
密钥
这也是一个随机值,但您必须对其保密,因为它可以用于加密和解密。您通常拥有用于多个加密的相同密钥。
从哪里获得好的随机性?
/dev/urandom
如果您在 Linux、BSD或其他 unixoid 系统上,只需从getrandom()
. 不要使用 Tclsexpr {rand()}
或类似的伪随机数生成器 (PRNG)。在 Windows TWAPI 上,该CryptGenRandom
函数将是最好的主意,但遗憾的是没有包含 Tcl 高级包装器。
够了吗?
要看。如果您只是想从粗略的外观中隐藏一点纯文本,也许。如果您有攻击者操纵您的数据或积极尝试入侵您的系统,那就更少了。普通的 AES-CBC 有很多你可以做错的事情,甚至专家也做错了(阅读有关 AES-CBC 的 SSL/TLS 1.0 问题)。
最后的话:如果您是加密算法的新手,请确保您了解您想要和需要保护的内容,有很多陷阱。