4

我目前正在使用使用 AES 128 密钥的Fernet加密。但是我的客户需要使用 AES 256。我对密码学不是很熟悉,但这是我目前所理解的。

Fernet 需要一个分成两半的 256 位密钥。前半部分是签名密钥,后半部分是加密密钥。因为它们是 128 位长,所以它是 AES 128。

将输入密钥加倍并修改如下实现以获得 AES 256 是否足够?

class Fernet(object):
    def __init__(self, key, backend=None):
        if backend is None:
            backend = default_backend()

        key = base64.urlsafe_b64decode(key) # Here 512 bits long instead of 256

        self._signing_key = key[:16] # double this
        self._encryption_key = key[16:] # double this
        self._backend = backend
4

2 回答 2

3

是的,您可以将二进制输入加倍,密钥之前的输入是 base 64 编码的。结果是否为 256 位安全取决于密钥是如何生成的。所以是的,可以将密钥的大小检查加倍,但这并不能说明什么。如果输入密钥材料是 512 位且安全级别为 512 位,那么是的,那么拆分密钥就可以了。

就我个人而言,我会推荐(我过去曾向 Fernet 推荐过)使用 HKDF 来派生两个密钥,而不是仅仅将密钥一分为二。我看不到密钥是如何生成的,但如果它是由 PBKDF2 生成的——Fernet 确实使用它来从密码创建密钥——那么 PBKDF2 可能需要双倍的工作量来生成 512 位,而攻击者只需生成 256位来执行攻击(并因此执行一半的工作)。

请注意,使用 base64 编码对于键来说不是很好,因为在大多数运行时字符串很难从内存中删除;如果密钥存储在密钥库中会更好。

于 2018-05-19T19:29:36.170 回答
1

Fernet规范是使用 AES-128。如果您修改算法以使用 AES-256,那么您将不再使用Fernet。如果要求您同时使用 Fernet 和 AES-256,我建议您使用 AES-256 独立加密您的有效负载,然后将 Fernet 算法应用于结果。这实质上是使用 AES-128 再次对其进行加密。

于 2018-06-22T23:41:31.120 回答