gpt4 book ai didi

c# - 包含特殊字符的哈希查询字符串不起作用

转载 作者:行者123 更新时间:2023-11-30 19:17:37 29 4
gpt4 key购买 nike

我已经发布了几个关于 token 和密码重置的问题,并最终设法解决了所有问题。谢谢大家!

因此,在了解某些字符在查询字符串中不起作用之前,我决定对查询字符串进行哈希处理,但正如您所猜到的那样,加号被删除了.

如何保护或散列查询字符串?

这是我收到的公司电子邮件中的示例,字符串如下所示:

AweVZe-LujIAuh8i9HiXMCNDIRXfSZYv14o4KX0KywJAGlLklGC1hSw-bJWCYfia-pkBbessPNKtQQ&t=pr&ifl

在我的设置中,我只是使用一个 GUID。但这有关系吗?

在我的场景中,即使没有 GIUD,用户也无法访问密码页面。那是因为如果查询字符串与 session 变量不匹配,页面设置为重定向加载?

有没有办法处理查询字符串以给出上述结果?

这个问题更多的是获取知识。

更新:

这是哈希码:

    public static string QueryStringHash(string input)
{
byte[] inputBytes = Encoding.UTF8.GetBytes();
SHA512Managed sha512 = new SHA512Managed();

byte[] outputBytes = sha512.ComputeHash(inputBytes);
return Convert.ToBase64String(outputBytes);
}

然后我将 HASH (UserID) 传递给 SESSION,然后再将其作为查询字符串发送:在下一页,Session HASH 与 Query 不同,导致值不匹配并导致查询字符串无效。

注意:我创建了一个名为 Encryption 的类来处理所有哈希和加密。

Session["QueryString"] = Encryption.QueryStringHash(UserID);

Response.Redirect("~/public/reset-password.aspx?uprl=" +
HttpUtility.UrlEncode(Session["QueryString"].ToString()));

我也尝试了此页面上提到的所有内容,但没有成功:

How do I replace all the spaces with %20 in C#

感谢阅读。

最佳答案

问题在于 base64 编码使用了“+”和“/”字符,它们在 URL 中具有特殊含义。如果要对查询参数进行 base64 编码,则必须更改这些字符。通常,这是通过将“+”和“/”分别替换为“-”和“_”(破折号和下划线)来完成的,如 RFC 4648 中指定的那样。 .

然后,在您的代码中,您会这样做:

public static string QueryStringHash(string input)
{
byte[] inputBytes = Encoding.UTF8.GetBytes();
SHA512Managed sha512 = new SHA512Managed();

byte[] outputBytes = sha512.ComputeHash(inputBytes);
string b64 = Convert.ToBase64String(outputBytes);
b64 = b64.Replace('+', '-');
return b64.Replace('/', '_');
}

当然,在接收端,你需要在调用base 64转换方法之前,将'-'和'_'替换成对应的'+'和'/'。

他们建议不要使用填充字符 ('='),但如果您这样做,则应该对其进行 URL 编码。如果您始终知道编码字符串的长度,则无需传达填充字符。您可以在接收端添加所需的填充字符。但是,如果您可以使用可变长度的字符串,那么您将需要填充字符。

每当您看到查询参数中使用 base 64 编码时,它就是这样做的。它无处不在,也许最常见于 YouTube 视频 ID。

关于c# - 包含特殊字符的哈希查询字符串不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17018812/

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