1

我有一个加密和解密文本的项目。我正在使用 Fernet 进行加密和解密。我学会了如何使用encrypt_at_time函数,但我不理解decrypt_at_time函数。我被看着这里:

https://cryptography.io/en/latest/fernet/#

它说我必须在函数中写token,ttl和。令牌是加密文本,但我不明白什么是和current_timedecrypt_at_time()ttlcurrent_time

我想从加密文本中获取加密时间。我该怎么做?

4

1 回答 1

1

我想从加密文本中获取加密时间。我该怎么做?

Fernet 令牌的结构是,s。费内特规格

Version | Timestamp | IV | Ciphertext | HMAC

其中版本为 1 个字节长,时间戳为 8 个字节,IV 为 16 个字节,密文为 16 个字节的倍数,HMAC 为 32 个字节。

这里的时间戳是从 1970-01-01 00:00:00 UTC 到创建令牌 s 之间经过的时间(以秒为单位)。在这里。因此,从时间戳可以确定以秒为单位的经过时间,并由此确定日期,s。这里

from cryptography.fernet import Fernet
from datetime import datetime

def getCreationDateTime(token):
    timestamp = f.extract_timestamp(token)
    creationDateTime = datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
    return creationDateTime

key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b'My secret data')
print(getCreationDateTime(token)) # e.g. 2021-04-28 18:29:42

没看懂decrypt_at_time函数……没看懂ttl和current_time是什么

encrypt_at_time()第二个参数 ( current_time) 中,可以将任意时间指定为令牌的创建时间。此处再次必须指定以秒为单位的时间,该时间从 1970 年 1 月 1 日 00:00:00 UTC 到所谓的令牌创建时间之间过去。通过将加密替换为以下代码,可以轻松地使用上述代码进行测试:

token = f.encrypt_at_time(b'My secret data', 0)
print(getCreationDateTime(token)) # 1970-01-01 00:00:00

它将 1970-01-01 00:00:00 UTC 设置为创建时间。

decrypt_at_time()第三个参数 ( current_time) 中,可用于指定任意时间作为解密时间(同样是从 1970-01-01 00:00:00 UTC 到所谓的令牌解密时间之间经过的时间,以秒为单位)。第二个参数 ( ttl) 指定令牌在创建后有效的时间(以秒为单位)。测试:

token = f.encrypt_at_time(b'My secret data', 0)
plaintext = f.decrypt_at_time(token, 45, 30)
print(plaintext) # b'My secret data'

这里的令牌据说是在 1970-01-01 00:00:00 UTC 创建的,据称是在 1970-01-01 00:00:30 UTC 执行解密。令牌是有效的,因为它在创建后的 45 秒内有效。

于 2021-04-28T19:30:21.130 回答