[英]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编码不是很好,因为在大多数运行时很难从内存中删除字符串。 如果密钥存储在密钥库中,那就更好了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.