当加密算法收到不支持的密钥大小时会发生什么?
What happens when the encryption algorithm receives an unsupported key size?
我尝试构建一个加密程序,我使用 realisation I took from GitHub there is an exception if the key is not of these sizes. But I want to use the key as a password, in KeePass 的 AES (256/192/128)(他们也使用此算法加密)我们可以创建不同大小的密码。我应该怎么办?我必须添加一些填充字节吗?或者我必须使用哈希算法来创建相同大小的密码?
当使用带有对称加密算法的密码时,处理此问题的常用方法是对密码进行哈希处理,然后使用哈希中的足够字节来构建加密密钥。这样做的好处是可以接受任何大小的密码而不必填充它(如果太长则 trim 它)。
例如,如果您的密码是“password”,则它的 SHA256 哈希值是(打印为十六进制)5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8。然后您可以使用此散列作为 AES256 的密钥。对于 AES128,使用哈希的前 16 个字节(即 5e884898da28047151d0e56f8dc62927)。
已接受的答案不正确、具有误导性且不安全!
基于密码的密钥派生 (PBKDF),一个小介绍
一般情况下,AES的密钥必须统一随机生成。人类很难记住随机密钥,因此我们使用密码并从中导出密钥。将密码转换为密钥的正确方法是使用 PBKDF,例如 PBKDF2,scrypt, or better using Argon2.
这些密钥推导函数带有一些参数,如info, salt, iteration count, memory size, thread amount
等。这些参数将来自很长的密码破解方法反制。
- 盐是用来防止彩虹的table.
- 迭代计数用于减少攻击者的密码搜索时间。为 PBKDF2 设置大约 1M 将使攻击者减慢 1M 倍。
- 内存大小用于使密码哈希算法难以记忆,使攻击者无法使用大量GPU/ASIC进行攻击。
- 即使在并行 CPU 中,线程数量也用于消除并行化。
可以根据您的目标安全性调整这些和类似参数(使用前请查看文档)。
使用 PBKDF 获取所需的密钥大小
这些 PBKDF 中的每一个都可以输出所需数量的密钥大小,128,256 或更多。甚至可以通过使用不同的 info
或 salt
参数来 derive multiple keys from a single password。
简单地用SHA256哈希是完全错误的,已经有彩虹table了,甚至在hashcat中也可以用于在 GPU 上进行大规模并行以典当您的密码。从不使用,
在你的情况下,由于 AES 密钥不是随机的,攻击者不会去暴力破解 AES,他们会寻找你的
密码、800K pawned list,可能还有基于知识的搜索。
选择一个好的密码
一个好的密码真的很重要,即使你使用非常强大的 PBKDF,比如最近的比赛冠军 Argon2。
一个人应该用dicewire or similarly Bip39 type password. xkc936很好地说明了这个想法。
有了好的密码,你甚至可以在设计糟糕的密码哈希登录机制中幸存下来,但是,你不能在 Facebook's openly stored password mechanism 上做得很好,他们真可耻!
我尝试构建一个加密程序,我使用 realisation I took from GitHub there is an exception if the key is not of these sizes. But I want to use the key as a password, in KeePass 的 AES (256/192/128)(他们也使用此算法加密)我们可以创建不同大小的密码。我应该怎么办?我必须添加一些填充字节吗?或者我必须使用哈希算法来创建相同大小的密码?
当使用带有对称加密算法的密码时,处理此问题的常用方法是对密码进行哈希处理,然后使用哈希中的足够字节来构建加密密钥。这样做的好处是可以接受任何大小的密码而不必填充它(如果太长则 trim 它)。
例如,如果您的密码是“password”,则它的 SHA256 哈希值是(打印为十六进制)5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8。然后您可以使用此散列作为 AES256 的密钥。对于 AES128,使用哈希的前 16 个字节(即 5e884898da28047151d0e56f8dc62927)。
已接受的答案不正确、具有误导性且不安全!
基于密码的密钥派生 (PBKDF),一个小介绍
一般情况下,AES的密钥必须统一随机生成。人类很难记住随机密钥,因此我们使用密码并从中导出密钥。将密码转换为密钥的正确方法是使用 PBKDF,例如 PBKDF2,scrypt, or better using Argon2.
这些密钥推导函数带有一些参数,如info, salt, iteration count, memory size, thread amount
等。这些参数将来自很长的密码破解方法反制。
- 盐是用来防止彩虹的table.
- 迭代计数用于减少攻击者的密码搜索时间。为 PBKDF2 设置大约 1M 将使攻击者减慢 1M 倍。
- 内存大小用于使密码哈希算法难以记忆,使攻击者无法使用大量GPU/ASIC进行攻击。
- 即使在并行 CPU 中,线程数量也用于消除并行化。
可以根据您的目标安全性调整这些和类似参数(使用前请查看文档)。
使用 PBKDF 获取所需的密钥大小
这些 PBKDF 中的每一个都可以输出所需数量的密钥大小,128,256 或更多。甚至可以通过使用不同的 info
或 salt
参数来 derive multiple keys from a single password。
简单地用SHA256哈希是完全错误的,已经有彩虹table了,甚至在hashcat中也可以用于在 GPU 上进行大规模并行以典当您的密码。从不使用,
在你的情况下,由于 AES 密钥不是随机的,攻击者不会去暴力破解 AES,他们会寻找你的 密码、800K pawned list,可能还有基于知识的搜索。
选择一个好的密码
一个好的密码真的很重要,即使你使用非常强大的 PBKDF,比如最近的比赛冠军 Argon2。
一个人应该用dicewire or similarly Bip39 type password. xkc936很好地说明了这个想法。
有了好的密码,你甚至可以在设计糟糕的密码哈希登录机制中幸存下来,但是,你不能在 Facebook's openly stored password mechanism 上做得很好,他们真可耻!