【问题标题】:Which encryption password does cryptography.fernet uses?cryptography.fernet 使用哪个加密密码?
【发布时间】:2021-05-03 08:16:27
【问题描述】:

我正在制作一个加密和解密文本的程序。我正在使用 Python 3.7 和 cryptography.fernet 库。我想在 GitHub 页面上输入一些关于我的程序加密标准的信息,但我不明白 Fernet 使用哪种加密方式。

这是我在项目中使用的示例代码。我想使用 256 位 (AES-256) 密钥进行加密,但此代码生成的密钥长度超过 32 个字符。它是 44 个字符。但在密码库的官方网站上,它说此代码生成 128 位密钥。这个 44 个字符(352 位)密钥的名称是什么?或者有什么方法可以在没有 PyCrypto 的情况下进行 256 位对称加密?

from cryptography.fernet import Fernet
import base64
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

textEncrypt = "Secret Data"
password = "Password"
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000)
key = base64.urlsafe_b64encode(kdf.derive(password))
fernet = Fernet(key)
encryptedText = fernet.encrypt(textEncrypt.encode())

这是此代码生成的密钥:aAT_LESBw_ZGlPA52cj4zQd6jBdx6gk5RmQWbpLY7e0=

【问题讨论】:

  • 密钥不是密码,不能互换使用。
  • 对不起,我的意思是“钥匙”。

标签: python-3.x encryption python-cryptography fernet


【解决方案1】:

文档里写的很好;

Implementation

Fernet 建立在许多标准加密原语之上。具体它使用:

  • CBC 模式下的 AES 使用 128 位密钥进行加密;使用 PKCS7 填充。
  • HMAC 使用 SHA256 进行身份验证。
  • 使用 os.urandom() 生成初始化向量。

如需了解完整详情,请咨询specification

因此,您不能将 AES-256 与 Fernet 一起使用

PyCrypto 可以为 AES-256 使用多种操作模式,包括 CBC、CTR、GCM、SIV 和 OCB


不清楚你是如何得到44字节的,这里是得到32字节的方法;

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import os


textEncrypt = "Secret Data"
password = "Password"
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000)

key = kdf.derive(str.encode(password))
print(len(key))
print(key)

和输出

32
b'K\xf6\x10a\xd6B`\x8a\x83\x13\xc2\xcfOJ\xcb\x02k$~\xf7v\x01\x80\xd0\xda\x93!\xaf\xa9B\x94\xfe'

【讨论】:

  • Fernet 只是密码库的一部分,它还支持 API 的“有害物质”部分中的所有其他模式。
  • @PresidentJamesK.Polk 你是绝对正确的。
  • 但是我无法再安装 PyCrypto,可能是因为 PyCrypto 已经死了。另外,128 位密钥中有多少个字符?是 44 岁吗?
  • 128 位密钥有 16 字节。编码是什么?
  • 对不起,我是加密新手,我不知道我使用的是哪种编码。但我在问题中给出了代码。如果你愿意,我可以发送完整的代码。我的密钥长度为 43 或 44 个字符。所以它不是 128 位密钥,对吧?
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多