使用不是32字节的任何密码都会使程序死机,出现以下错误:
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `4`,
right: `32`'简单的解决方案似乎要么用零填充它,要么将密码从0修剪到31,但为什么呢?我怀疑它有任何安全隐患,因为它不允许您使用超过32个字节。除了前面提到的简单解决方案之外,是否有其他解决方案可以让用户拥有更长的密码,而不是重写机箱?
以下是我的上下文代码片段:
use aes_gcm_siv::Aes256GcmSiv;
use aes_gcm_siv::aead::{Aead, NewAead, generic_array::GenericArray};
fn encrypt_file(pass: &str, file: &str) {
println!("{}", pass);
let key = GenericArray::from_slice(pass.as_bytes());
let cipher = Aes256GcmSiv::new(&key);
//...
}我不喜欢https://docs.rs/aes-gcm-siv/0.9.0/aes_gcm_siv/中给出的用法示例。使用32字符长的硬编码密钥似乎很有欺骗性。
发布于 2021-03-21 17:23:56
您的部分问题是您直接使用密码作为密钥。你不会想这么做的。AES需要128位、192位或256位密钥,理想情况下,您希望它与随机密钥无法区分,而密码通常不能与随机密钥区分。
如果您有一个低熵的秘密,那么您可能想要使用Argon2id之类的东西来获取密码短语和足够长度的随机盐来派生密钥。如果你有一个具有很多熵的强秘密,那么你可以使用像HKDF这样的东西来生成密钥。如果你做了这两件事中的任何一件,你都可以生成一个32字节长的密钥,如果你愿意的话,还可以生成一个用于加密的随机随机数。由于您使用的是AES-GCM-SIV,因此您也可以使用随机随机数并以这种方式派生密钥。
https://stackoverflow.com/questions/66730085
复制相似问题