【问题标题】:How to implement Fernet encryption with AES 256如何使用 AES 256 实现 Fernet 加密
【发布时间】:2018-10-29 17:44:45
【问题描述】:

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

【问题讨论】:

  • AES-128 和 AES-256 中的 128 和 256 是 bits 的数量,而不是密钥中的 bytes。正如 Fernet 文档所述:“Fernet 在 CBC 模式下使用 ...AES 和 128 位密钥进行加密;使用 PKCS7 填充。”
  • 翻译错误,谢谢。

标签: python encryption cryptography aes python-cryptography


【解决方案1】:

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

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

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

【讨论】:

  • 您的回答和问题似乎无关。我很困惑。
  • OP 说他想要 AES-256。他无法得到它,因为Fernet 不支持它。你似乎在谈论一些无关的事情。
  • 啊,无论如何,问这个问题的人似乎明白了。
  • 首先感谢您的详细回答。但是,我对“Fernet 不支持它(AES 256)”的评论感到有些困惑。如果我使用 512 位输入密钥(不是使用 Fernet 生成,而是从客户端密钥环生成)并使用 HKDF 派生它,则 256 位密钥将传递给 AES 算法,所以我得到 AES 256,不是吗?抱歉,如果我听起来不清楚,我一直对加密感到不舒服。
  • 对。您当然可以导出一个 512 位的密钥,然后将其分成两个 256 位的一半。有多少安全性当然取决于输入。但即使那是 256 位的安全性,那么这两个密钥仍应保持在 256 位左右的安全性,即不会比您已经拥有的安全性有所降低……对加密感到不清楚 - 或者至少感到防御性 - 围绕加密究竟是什么是必须的。你需要有点偏执,否则你会遇到问题。不过,像 Dan Boneh 的 Cryptography I 这样的课程是个好主意 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多