我目前正在使用Fernet加密,它使用AES 128密钥。但是我的客户端需要使用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
答案 0 :(得分:3)
是的,您可以将二进制输入加倍,键之前的输入是64位编码。如果结果是256位安全取决于键的生成方式。所以是的,可以将密钥的大小加上 check ,但这并没有多说。如果输入密钥材料为512位,安全级别为512位,则为是,则分割密钥即可。
就我个人而言,我建议(我过去曾向Fernet推荐)使用HKDF来获取两个键,而不是仅仅将键分成两个。我无法看到密钥是如何生成的,但是如果它是由PBKDF2生成的 - Fernet确实用它来创建密码密钥 - 那么PBKDF2可能需要两倍的工作量来生成512位,而攻击者只需要生成256用于执行攻击的位(因此执行一半的工作)。
请注意,使用base64编码对于密钥来说不是很好,因为在大多数运行时很难从内存中删除字符串;如果密钥存储在密钥库中,则会好得多。
答案 1 :(得分:0)
Fernet Specification将使用AES-128。如果您修改算法以使用AES-256,那么您将不再使用Fernet。如果要求同时使用Fernet和AES-256,则建议您使用AES-256独立加密有效负载,然后将Fernet算法应用于结果。本质上,这再次使用AES-128对其进行加密。