【问题标题】:URL safe parameters [duplicate]URL安全参数[重复]
【发布时间】:2014-06-30 23:59:32
【问题描述】:

我正在使用以下加密技术在 MVC 应用程序中加密查询字符串值。

所以网址将类似于controller/details/rlSRlRZwzbU%3d

但是当 param =2 和 KEY=mcbgp23njwmcinu0tij05vc2 这个函数返回UhMZc7/MNK8=

所以格式化后的 url 将是 controller/details/UhMZc7/MNK8%3d 并给出 404 Error

public static string Encrypt(string dataStr)
    {
        Byte[] inputByteArray = Encoding.ASCII.GetBytes(dataStr);
        var mstr = new MemoryStream();

        string KEY = HttpContext.Current.Session.SessionID;
        var key = Encoding.ASCII.GetBytes(KEY.Substring(0, 8));

        var des = new DESCryptoServiceProvider();           
        var cstr = new CryptoStream(mstr, des.CreateEncryptor(key, key), CryptoStreamMode.Write);
        cstr.Write(inputByteArray, 0, inputByteArray.Length);
        cstr.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
    }

如何使这个函数成为 MVC URL 安全的?有没有其他好的技术来生成 url-safe 加密格式?

编辑:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

【问题讨论】:

  • 显示您的路线图
  • @CarlosLanderas,添加路线映射
  • 我还想指出您的加密货币很烂。仅比凯撒加密强。 1)DES 的密钥太小(使用 AES) 2)缺少 MAC 启用填充预言(使用经过身份验证的加密) 3)您默默地破坏了非 ASCII 输入(使用 UTF8) 4)您使用与密钥和 IV 相同的值。您应该为您加密的每条消息使用一个新的随机 IV。 5)您使用 ASCII 字符串作为键。密钥是二进制的,请改用 Base64 编码的随机值。 6)不需要流。只需致电encryptor.TransformFinalBlock
  • @CodesInChaos,你的步骤听起来不错。你能给我提供一个实现的代码/文章吗?我将遵循这一点,因为我是开发新手并且不太了解加密技术:(

标签: c# asp.net asp.net-mvc asp.net-mvc-4 encryption


【解决方案1】:

问题在于 Base64 编码使用 / 和 + 字符,它们是 URL 中的特殊字符。解决此问题的典型方法是使用修改后的 Base64 编码,将 / 转换为 _ 并将“+”转换为“-”。这称为“base64url”编码。请参阅维基百科文章中的variants summary table

您可以通过两种简单的方法做到这一点:

static string ToBase64Url(string base64)
{
    return base64.Replace("/", "_").Replace("+", "-");
}

static string FromBase64Url(string base64Url)
{
    return base64Url.Replace("_", "/").Replace("-", "+");
}

然后,在您的代码中,您将替换这一行:

return Convert.ToBase64String(ms.ToArray());

与:

return ToBase64Url(Convert.ToBase64String(ms.ToArray()));

当然,您还必须在另一端正确解码:从 Base64Url 转换为标准 Base64,然后将其转换为字节数组。

【讨论】:

  • 谢谢吉姆。您对@CodesInChaos 对 AES 技术的评论有任何想法吗?
  • @Billa:我对加密的了解不够多,无法对此发表评论。无论您使用哪种加密货币,您仍然需要对二进制结果进行 base64 编码,这意味着您必须使用这种技术或类似的方法来映射有问题的字符。我想你可以编写自己的 base62 编码器/解码器,但这似乎有点过头了。
猜你喜欢
  • 2011-11-25
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多