当前位置: 首页 > 知识库问答 >
问题:

如何用AES 256实现Fernet加密

艾阳羽
2023-03-14

我目前正在使用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

共有2个答案

范瀚昂
2023-03-14

Fernet规范使用AES-128。如果将算法修改为使用AES-256,则不再使用Fernet。如果要求同时使用Fernet和AES-256,我建议使用AES-256单独加密有效负载,然后对结果应用Fernet算法。这实际上是使用AES-128再次加密。

姚子石
2023-03-14

是的,你可以将二进制输入翻倍,在密钥被base64编码之前的输入。结果是否为256位安全取决于密钥的生成方式。所以,是的,钥匙上的尺寸检查可以加倍,但这并不能说明什么。如果输入密钥材料为512位,安全级别为512位,则为“是”,则可以html" target="_blank">拆分密钥。

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

请注意,在大多数运行时,字符串很难从内存中删除,因此对键使用Base64编码不太好;如果键存储在键存储中,效果会更好。

 类似资料:
  • 本文向大家介绍PHP实现AES256加密算法实例,包括了PHP实现AES256加密算法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现AES256加密算法的方法,是较为常见的一种加密算法。分享给大家供大家参考。具体如下: aes.class.php文件如下: aesctr.class.php文件如下: Demo实例程序如下: 这里再介绍另一使用 PHP mcrypt 加解密方

  • 进一步的研究表明,cipher.update(“bla”)返回“-”(单个字符...奇怪),而cipher.final()返回一个空字符串。我认为这不可能是一个正确的密文,至少应该有明文的大小...

  • 问题内容: 我有一些需要解密的加密文本。它使用AES-256-CBC加密。我有加密的文本,密钥和iv。但是,无论我尝试什么,我似乎都无法正常工作。 互联网建议mcrypt的Rijndael密码应该能够做到这一点,所以这就是我现在所拥有的: 目前,我收到2条警告,并且输出乱码: 任何帮助,将不胜感激。 问题答案: 我并不十分熟悉的东西,但它似乎是试图替代将是一个明显的下一个步骤… 编辑: 您是对的,

  • 问题内容: 我这样在Node.js中加密了一个字符串。 我注意到nodejs中的缓冲区就像十六进制,但每2个连续字符都成对出现。因此,如果我将其转换为十六进制,则长度只有一半。 例: 缓冲: 十六进制: 现在,我在aes256中使用的密钥的长度不能为64。这里,缓冲区的长度为32,十六进制的长度为64。 我想在golang中解密此密码,我将不得不使用此密钥和iv对其进行解密。 golang中的ae

  • 我试图了解如何通过使用PBKDF2和SHA256获得派生密钥。 我很纠结,需要一个清晰易懂的例子。 到目前为止我所拥有的: > 我找到了https://en.wikipedia.org/wiki/PBKDF2其中有一个示例,但使用SHA1,具有以下值: 密码plnlrtfpijpuhqylxbgqiyipieyxvfsavzgxbbcfusqkozwpngsyjqlmjsytrmd UTF8 盐A

  • 问题内容: Java 256位AES加密 基本上,我正在做的是编写一个程序,该程序将加密通过TCP / IP发送的请求,然后由服务器程序解密。加密将需要是AES,并且进行一些研究后发现我需要使用CBC和PKCS5Padding。所以基本上我也需要一个秘密密钥和一个IV。 我正在开发的应用程序是用于手机的,因此我想使用Java安全包来减小尺寸。我已经完成了设计,但是不确定IV和共享密钥的实现。 这是