1

我正在学习Pydantic模块,试图通过一个玩具FastAPI Web 后端来采用它的特性/优点作为示例实现。

我选择使用PydanticSecretStr来“隐藏”密码。我知道它不是很安全,而且我还在passlib数据库存储中使用正确的密码加密(并使用 HTTPS 来确保传输安全)。

但这让我想到:如果没有真正的安全性SecretStr,它的目的是什么?

我并不是说这听起来很煽情。Pydantic 并未声称 Secret Types 是安全的。他们提供的唯一声明是:

您可以使用SecretStrSecretBytes数据类型来存储您不希望在日志记录或回溯中可见的敏感信息。

但我不明白这一点:如何SecretStr帮助隐藏日志记录或回溯?我不能确保根本不记录密码吗?


有人可以提供解释+示例来帮助我更好地理解它何时以及如何有用吗?我正在努力寻找它的真正目的......如果没有好处,那么最好只使用str模型/模式而不是SecretStr.

4

1 回答 1

3

您自己已经回答了大部分问题。

您可以使用 SecretStr 和 SecretBytes 数据类型来存储您不希望在日志记录或回溯中可见的敏感信息。

我想补充另一个好处。

开发人员不断被提醒他们正在处理秘密,因为他们需要调用.get_secret_value()才能读取实际值。

我们可以将其视为句法盐(类似于使事情变得更容易的句法糖)。语法盐使事情更难搞砸。如果您尝试在 FastAPI 等响应模型中发送 SecretStr,则需要主动启用该功能。

文档

class SimpleModelDumpable(BaseModel):
    password: SecretStr

    class Config:
        json_encoders = {
            SecretStr: lambda v: v.get_secret_value() if v else None
         }
于 2020-12-13T16:21:04.060 回答