Rust aes_gcm_siv 32字节密钥要求的解决方案?

Rust aes_gcm_siv 32字节密钥要求的解决方案?,rust,aes-gcm,Rust,Aes Gcm,使用任何非32字节的密码都会导致程序死机: thread 'main' panicked at 'assertion failed: `(left == right)` left: `4`, right: `32`' 简单的解决方案似乎是要么用零填充密码,要么将密码从0减少到31,但为什么呢?我怀疑它有任何安全隐患,因为它不会让您使用超过32字节。除了上面提到的简单解决方案之外,是否有其他解决方案允许用户拥有更长的密码,而不是重写板条箱 以下是我的上下文代码片段: use aes_gcm

使用任何非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);
    //...
}

我不喜欢中给出的用法示例。使用32个字符长的硬编码密钥似乎很有欺骗性。

问题的一部分在于您直接将密码用作密钥。你不想那样做。AES需要一个128位、192位或256位的密钥,理想情况下,您希望它与随机密钥(密码通常不是随机密钥)无法区分


如果你有一个低熵的秘密,你可能会想使用类似Argon2id的东西来获取这个密码短语和一个足够长的随机salt来派生一个密钥。如果你有一个具有大量熵的强秘密,那么你可以使用类似HKDF的东西来生成密钥。如果您执行上述任一操作,您可以生成一个正好32字节长的密钥,如果您愿意,还可以生成一个用于加密的随机nonce。因为您使用的是AES-GCM-SIV,所以您也可以使用随机的nonce,并以这种方式导出密钥。

太棒了!我的问题是,由于cargo doc上给出的示例,认为密钥与密码相同。