繁体   English   中英

如何使用AES 256实现Fernet加密

[英]How to implement Fernet encryption with AES 256

我目前正在使用使用AES 128密钥的Fernet加密。 但是我的客户要求使用AES256。我对加密不是很熟悉,但是到目前为止,这是我所了解的。

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

是的,您可以将二进制输入加倍,即在对密钥进行base 64编码之前输入。 如果结果是256位,则安全性取决于密钥的生成方式 所以是的,可以对密钥的大小检查加倍,但这并不能说明太多。 如果输入密钥材料是512位,并且安全级别为512位,则可以,则可以拆分密钥。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM