使用提供的密钥加密文本 python

如何使用我自己的密钥加密?

我已经通过网络搜索来执行此操作。如何使用我自己的密钥加密?在 python 中,我更喜欢 密码学。它不断弹出错误Fernet key must be 32 url-safe base64-encoded bytesTypeError: 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



如你看到的cipher_suite = Fernet(base64.b64encode(key))   #Fernet key must be 32 url-safe base64-encoded 


我如何解决它?


慕桂英4014372
浏览 138回答 1
1回答

UYOU

这里的主要问题是 Fernet 需要一个 url 安全的 base64 编码字符串,它可以解码为 32 字节。这种结构的安全性依赖于这 32 个字节包含足够的熵,这样攻击者就无法猜到它。在您的示例中,您使用的是堆栈跟踪的 SHA224 哈希。有几个问题在起作用:224 位/每字节 8 位 = 28 字节,这不是足够长的输出。散列堆栈跟踪不是派生密钥的安全方法。当它应该使用urlsafe_b64encode.一般来说,最好使用 生成您的 Fernet 密钥Fernet.generate_key(),但这需要您将密钥存储在某个地方以备后用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python