有没有空值可以欺骗Python hashlib?

有没有空值可以欺骗Python hashlib?,python,python-3.x,fastapi,hashlib,Python,Python 3.x,Fastapi,Hashlib,所以我正在从事PythonFastAPI项目。 我当前的目标是正确验证密码,这样正确的密码应该触发HTTP 204响应代码,在其他情况下(也是空参数),应该触发HTTP 401 示例如下所示: 这里的回答应该是:204 /auth?password=haslo&password_hash=013c6889f799cd986a735118e1888727d1435f7f623d05d58c61bf2cd8b49ac90105e5786ceaabd62bbc27336153d0d316b2d

所以我正在从事PythonFastAPI项目。 我当前的目标是正确验证密码,这样正确的密码应该触发HTTP 204响应代码,在其他情况下(也是空参数),应该触发HTTP 401

示例如下所示:

这里的回答应该是:204

/auth?password=haslo&password_hash=013c6889f799cd986a735118e1888727d1435f7f623d05d58c61bf2cd8b49ac90105e5786ceaabd62bbc27336153d0d316b2d13b36804080c44aa6198c533215
这里是401

/auth?password=haslo&password_hash=f34ad4b3ae1e2cf33092e2abb60dc0444781c15d0e2e9ecdb37e4b14176a0164027b05900e09fa0f61a1882e0b89fbfa5dcfcc9765dd2ca4377e2c794837e091
我正确地处理了RequestValidationError,我的哈希密码验证如下所示:

class AuthResponse(BaseModel):
    status_code: int

@app.get("/auth", response_model=AuthResponse)
async def auth(password: str, password_hash: str, response: Response):
    try:
        m = hashlib.sha512(bytes(password, encoding="ASCII"))
        if str(m.hexdigest()) == password_hash:
            response.status_code = 204
        else:
            response.status_code = 401
    except Exception:
        response.status_code = 401
    return AuthResponse(status_code=response.status_code)
现在我想不出任何传递的参数会触发不正确的验证(传递204代码而不是401代码),但正如外部断言所示,这似乎是可能的。我知道它一定是关于空值的,而不是
None
,但我自己无法理解

我已经尝试过这样的模式:

/auth?password=&password_hash=

/auth?password=%00&password_hash=%00

http://127.0.0.1:8000/auth?password=%0&password_hash=%0

我非常感谢您的帮助、提示或建议。

谢谢大家,这只是一个编码练习项目,所以很多事情可能会有点不对劲。但碰巧的是,我没有检查创建有效哈希的空密码参数,但根据任务,它是不正确的。

等等,什么?客户端同时发送密码和散列?您是否将这些值相互检查,而不是服务器端存储的哈希?你用SHA512代替密码散列算法?这是严重错误的。这其中没有一部分会关心用户的“实际”密码是什么。只要请求包含一些“密码”及其SHA512散列,它们就在其中!基本上,您的“身份验证”API实际上只检查用户是否知道某个字符串、任何字符串的SHA512哈希。