我想从加密文本中获取加密时间。我该怎么做?
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 秒内有效。