gpt4 book ai didi

c# - 这种签名 URL 的实现是否相当安全?

转载 作者:行者123 更新时间:2023-12-04 10:13:32 26 4
gpt4 key购买 nike

我正在尝试实现签名 URL,以便对静态文件进行短期访问。
这个想法是:

  • 生成一个带有过期时间戳的 URL(例如 https://example.com/file.png?download=false&expires=1586852158)
  • 使用 HMACSHA256 和共享 key 对其进行签名,并将签名附加到 URL 的末尾(例如 https://example.com/file.png?download=false&expires=1586852158&signature=6635ea14baeeaaffe71333cf6c7fa1f0af9f6cd1a17abb4e75ca275dec5906d1

  • 当我在服务器上收到请求时,我取出 signature参数并验证使用 HMACSHA256 签名的 URL 的其余部分和相同的共享 key 产生相同的签名。

    实现如下:

        public static class URLSigner
    {
    private static string GetSignatureForUri(string uri, byte[] key)
    {
    var hmac = new HMACSHA256(key);
    var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(uri));
    var hexSignature = BitConverter.ToString(signature).Replace("-", string.Empty).ToLowerInvariant();
    return hexSignature;
    }

    public static string SignUri(string uri, byte[] key)
    {
    var hexSignature = GetSignatureForUri(uri, key);
    return QueryHelpers.AddQueryString(uri, new Dictionary<string, string> { { "signature", hexSignature }});
    }

    public static bool VerifyUri(string uri, byte[] key)
    {
    var signatureRegex = "[\\?&]signature=([a-z0-9]+)$";
    var signatureMatch = Regex.Match(uri, signatureRegex);
    if (!signatureMatch.Success || signatureMatch.Groups.Count != 2)
    return false;
    var parsedSignature = signatureMatch.Groups[1].Value;

    var originalUri = Regex.Replace(uri, signatureRegex, "");
    var hexSignature = GetSignatureForUri(originalUri, key);
    return hexSignature == parsedSignature;
    }
    }

    它是这样使用的:

    var signedUri = URLSigner.SignUri("https://example.com/file.png?download=false", secretKey);
    var isVerified = URLSigner.VerifyUri(signedUri, secretKey);

    这种签名 URL 的实现是否相当安全?

    最佳答案

    您的实现似乎缺少对到期时间的验证,因此任何一个 key 目前都可以无限期地工作。

    否则,我一般认为这种方法没有任何问题。不过,您可能希望添加一个 key ,而不仅仅是时间戳,用于以某种方式识别用户或请求。

    这是一篇关于如何将一般方法用于一次性密码的好文章,这基本上就是您正在做的事情。

    https://www.freecodecamp.org/news/how-time-based-one-time-passwords-work-and-why-you-should-use-them-in-your-app-fdd2b9ed43c3/

    关于c# - 这种签名 URL 的实现是否相当安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61203451/

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