使用提供的密钥加密文本 python
Using supplied key to encrypt text python
如何使用我自己的密钥加密?
我已经通过网络搜索来执行此操作。 如何使用我自己的密钥加密? 在 python 我更喜欢
密码学 不过。它不断弹出错误 Fernet key must be 32 url-safe base64-encoded bytes
和 TypeError: a bytes-like object is required, not 'str'
。我正在尝试创建一个私有变量函数。我是python新人。
这是我未完成的代码。感谢您的帮助。
from cryptography.fernet import Fernet
import inspect
import hashlib
import base64 #Fernet key must be 32 url-safe base64-encoded bytes
def encode(key, string):
encoded_chars = []
for i in xrange(len(string)):
key_c = key[i % len(key)]
encoded_c = chr(ord(string[i]) + ord(key_c) % 256)
encoded_chars.append(encoded_c)
encoded_string = "".join(encoded_chars)
return base64.urlsafe_b64encode(encoded_string)
class private:
class sec_storage:
data = dict()
hashed_data = dict()
class var:
def create(var,value):
# creates key based on caller
key = hashlib.sha224(str(inspect.stack()).encode()).hexdigest()
cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded bytes
# encrypts using key
encoded_text = cipher_suite.encrypt(value)
# prepares storage
hashed_var = hashlib.sha224("plus".join(list(var.encode(),key[:12])).hexdigest())
hashed_value = hashlib.sha224(value.encode()).hexdigest()[12:30]
private.sec_storage.data[hashed_var] = encoded_text
private.sec_storage.hashed_data[hashed_var] = hashed_value
def read(var):
# creates key based on caller
key = hashlib.sha224(str(inspect.stack()).encode()).hexdigest()
cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded bytes
# retrieve var
hashed_varname = hashlib.sha224("plus".join(list(var.encode(),key[:12])).hexdigest())
try:
hashed_var = private.sec_storage.data[hashed_varname]
except NameError:
raise NameError("Requested variable not found")
# decrypts using key
decoded_text = cipher_suite.decrypt(hashed_var)
hashed_value = hashlib.sha224(decoded_text.encode()).hexdigest()[12:30]
# checks if password is correct
if private.sec_storage.hashed_data[hashed_varname] != hashed_value:
raise ValueError("Value not as requested")
return decoded_text
private.var.create("myvar","Hello World!")
print(private.var.read("myvar"))
print(sec_storage.data)
如你所见cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded
如何解决?
这里的主要问题是 Fernet 期望 url-safe base64 编码的字符串解码为 32 字节。这种结构的安全性依赖于这 32 个字节包含足够的熵,这样攻击者就无法猜到它。
在您的示例中,您使用的是堆栈跟踪的 SHA224 哈希。有几个问题在起作用:
- 224 bits/8 位每字节=28 字节,这不是足够长的输出。
- 散列堆栈跟踪不是派生密钥的安全方法。
- 当它应该使用
urlsafe_b64encode
. 时,您已经通过 vanilla base64 进行了编码
一般来说,最好使用 Fernet.generate_key()
生成您的 Fernet 密钥,但这需要您将密钥存储在某个地方以备后用。如果您想从密码之类的内容生成密钥,文档中有一个示例 (https://cryptography.io/en/latest/fernet/#using-passwords-with-fernet)。
如何使用我自己的密钥加密?
我已经通过网络搜索来执行此操作。 如何使用我自己的密钥加密? 在 python 我更喜欢
密码学 不过。它不断弹出错误 Fernet key must be 32 url-safe base64-encoded bytes
和 TypeError: a bytes-like object is required, not 'str'
。我正在尝试创建一个私有变量函数。我是python新人。
这是我未完成的代码。感谢您的帮助。
from cryptography.fernet import Fernet
import inspect
import hashlib
import base64 #Fernet key must be 32 url-safe base64-encoded bytes
def encode(key, string):
encoded_chars = []
for i in xrange(len(string)):
key_c = key[i % len(key)]
encoded_c = chr(ord(string[i]) + ord(key_c) % 256)
encoded_chars.append(encoded_c)
encoded_string = "".join(encoded_chars)
return base64.urlsafe_b64encode(encoded_string)
class private:
class sec_storage:
data = dict()
hashed_data = dict()
class var:
def create(var,value):
# creates key based on caller
key = hashlib.sha224(str(inspect.stack()).encode()).hexdigest()
cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded bytes
# encrypts using key
encoded_text = cipher_suite.encrypt(value)
# prepares storage
hashed_var = hashlib.sha224("plus".join(list(var.encode(),key[:12])).hexdigest())
hashed_value = hashlib.sha224(value.encode()).hexdigest()[12:30]
private.sec_storage.data[hashed_var] = encoded_text
private.sec_storage.hashed_data[hashed_var] = hashed_value
def read(var):
# creates key based on caller
key = hashlib.sha224(str(inspect.stack()).encode()).hexdigest()
cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded bytes
# retrieve var
hashed_varname = hashlib.sha224("plus".join(list(var.encode(),key[:12])).hexdigest())
try:
hashed_var = private.sec_storage.data[hashed_varname]
except NameError:
raise NameError("Requested variable not found")
# decrypts using key
decoded_text = cipher_suite.decrypt(hashed_var)
hashed_value = hashlib.sha224(decoded_text.encode()).hexdigest()[12:30]
# checks if password is correct
if private.sec_storage.hashed_data[hashed_varname] != hashed_value:
raise ValueError("Value not as requested")
return decoded_text
private.var.create("myvar","Hello World!")
print(private.var.read("myvar"))
print(sec_storage.data)
如你所见cipher_suite = Fernet(base64.b64encode(key)) #Fernet key must be 32 url-safe base64-encoded
如何解决?
这里的主要问题是 Fernet 期望 url-safe base64 编码的字符串解码为 32 字节。这种结构的安全性依赖于这 32 个字节包含足够的熵,这样攻击者就无法猜到它。
在您的示例中,您使用的是堆栈跟踪的 SHA224 哈希。有几个问题在起作用:
- 224 bits/8 位每字节=28 字节,这不是足够长的输出。
- 散列堆栈跟踪不是派生密钥的安全方法。
- 当它应该使用
urlsafe_b64encode
. 时,您已经通过 vanilla base64 进行了编码
一般来说,最好使用 Fernet.generate_key()
生成您的 Fernet 密钥,但这需要您将密钥存储在某个地方以备后用。如果您想从密码之类的内容生成密钥,文档中有一个示例 (https://cryptography.io/en/latest/fernet/#using-passwords-with-fernet)。