gpt4 book ai didi

python - 如何解密最初使用 Fernet 加密的不同服务上的值?

转载 作者:行者123 更新时间:2023-12-04 11:38:50 26 4
gpt4 key购买 nike

我正在玩一个基于 python 后端的项目。我将使用 Django 来处理“核心”内容,并使用 FastAPI 来处理一些爬虫。我正在使用 Fernet 使用 Django 将一些数据加密到数据库中模块和自定义 Field .

class EncryptedField(models.CharField):
description = "Save encrypted data to DB an read as string on application level."

def __init__(self, *args, **kwargs):
kwargs["max_length"] = 1000
super().__init__(*args, **kwargs)

@cached_property
def fernet(self) -> Fernet:
return Fernet(key=settings.FERNET_KEY)

def get_internal_type(self) -> str:
return "BinaryField"

def get_db_prep_save(
self, value: Any, connection: BaseDatabaseWrapper
) -> Union[memoryview, None]:
value = super().get_db_prep_save(value, connection)
if value is not None:
encrypted_value = self.fernet.encrypt(data=force_bytes(s=value))
return connection.Database.Binary(encrypted_value)

def from_db_value(self, value: bytes, *args) -> Union[str, None]:
if value is not None:
decrypted_value = self.fernet.decrypt(token=force_bytes(s=value))
return self.to_python(value=force_str(s=decrypted_value))
一切都按预期工作,问题是当我尝试解密 FastAPI 端的值时:
def decrypt(value: bytes):
return Fernet(FERNET_KEY).decrypt(token=value)
一些重要信息:
  • 我仔细检查和 settings.FERNET_KEY == FERNET_KEY ,即,我在两侧使用相同的键。
  • 两个服务共享相同的数据库,并且函数在读取时接收到不同的值。
  • 姜戈 -> from_db_value -> value -> b"gAAAAABhSm94ADjyQES3JL-EiEX4pH2odwJnJe2qsuGk_K685vseoVNN6kuoF9CRdf2GxiIViOgiKVcZMk5olg7FrJL2cmMFvg=="
  • FastAPI -> user.encrypted_field -> value -> b"pbkdf2_sha256$260000$RzIJ5Vg3Yx8JTz4y5ZHttZ$0z9CuQiPCJrBZqc/5DvxiEcbNHZpu8hAZgmibAe7nrQ=" .我实际上进入了数据库并检查了这是存储在那里的值。 user来自这里:

  • from sqlmodel import Session, select

    from .models import User


    async def get_user(db: Session, username: str) -> str:
    statement = select(User).where(User.username == username)
    return db.exec(statement).first()



  • 所以我想知道在 from_db_value 之前有什么东西那是以某种方式转换值(value)?!
    最后一种选择是解密 Django 上的值并将其直接发送到 FastAPI,但我不希望这样做。
    如何解密 FastAPI 上的值?

    最佳答案

    解码值就足够了:

    def decrypt(value: bytes):
    return Fernet(FERNET_KEY).decrypt(token=value)
    您确定要解密相同的数据吗?对我来说,这看起来像是一个加密的密码字段和其他一些字段。
    mysql> select first_name, password from users_user where login='test'
    +------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+
    | first_name | password |
    | gAAAAABhSm94ADjyQES3JL-EiEX4pH2odwJnJe2qsuGk_K685vseoVNN6kuoF9CRdf2GxiIViOgiKVcZMk5olg7FrJL2cmMFvg== | pbkdf2_sha256$260000$RzIJ5Vg3Yx8JTz4y5ZHttZ$0z9CuQiPCJrBZqc/5DvxiEcbNHZpu8hAZgmibAe7nrQ= |

    关于python - 如何解密最初使用 Fernet 加密的不同服务上的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69286403/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com