【发布时间】:2021-12-05 20:27:42
【问题描述】:
我尝试构建一个加密程序,并使用来自realisation 的 AES (256/192/128) 我从 GitHub 获取,如果密钥不是这些大小,则会出现异常。但是我想用密钥作为密码,在KeePass(他们也用这个算法加密)我们可以创建不同大小的密码。我该怎么办?我必须添加一些填充字节?或者我必须使用哈希算法来创建相同大小的密码?
【问题讨论】:
标签: c++ c encryption passwords
我尝试构建一个加密程序,并使用来自realisation 的 AES (256/192/128) 我从 GitHub 获取,如果密钥不是这些大小,则会出现异常。但是我想用密钥作为密码,在KeePass(他们也用这个算法加密)我们可以创建不同大小的密码。我该怎么办?我必须添加一些填充字节?或者我必须使用哈希算法来创建相同大小的密码?
【问题讨论】:
标签: c++ c encryption passwords
当使用具有对称加密算法的密码时,处理此问题的常用方法是对密码进行哈希处理,然后使用哈希中的足够字节来构建加密密钥。这样做的好处是可以接受任何大小的密码短语,而无需填充(如果太长则修剪)。
例如,如果您的密码是“密码”,则其 SHA256 哈希为(打印为十六进制)5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8。然后,您可以将此哈希用作 AES256 的密钥。对于 AES128,使用哈希的前 16 个字节(即 5e884898da28047151d0e56f8dc62927)。
【讨论】:
接受的答案不正确、具有误导性且不安全!
基于密码的密钥派生 (PBKDF),小介绍
通常,AES 的密钥必须均匀随机生成。人类很难记住随机密钥,因此我们使用密码并从中派生密钥。将密码转换为密钥的正确方法是使用 PBKDF2、scrypt 等 PBKDF,或者使用Argon2 更好。
这些密钥派生函数采用info, salt, iteration count, memory size, thread amount等一些参数。这些参数将来自一长串针对密码破解方法的对策。
这些和类似的参数可以根据您的目标安全性进行调整(使用前请查看文档)。
使用 PBKDF 获得所需的密钥大小
这些 PBKDF 中的每一个都可以输出所需数量的密钥大小(128,256 或更多)。甚至可以通过使用不同的info 或salt 参数来derive multiple keys from a single password。
简单地用 SHA256 散列是完全错误的,已经有彩虹表可以解决这个问题,甚至在 hashcat 中也可以用于 GPU 上的大规模并行来典当您的密码。千万不要用,
在你的情况下,由于 AES 密钥不是随机的,攻击者不会去暴力破解 AES,他们会寻找你的 密码、800K pawned list,可能还有基于知识的搜索。
选择一个好的密码
即使您使用非常强大的 PBKDF(例如最近的竞赛获胜者 Argon2),一个好的密码也非常重要。
应该使用dicewire 或类似的Bip39 输入密码。 xkc936 很好的表达了这个想法。
有了一个好的密码,你甚至可以在设计糟糕的密码哈希登录机制中幸存下来,但是,你不能在 Facebook's openly stored password mechanism 上做得很好,真丢脸!
【讨论】: