URL安全参数

时间:2014-06-12 15:46:03

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

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

所以网址会像controller/details/rlSRlRZwzbU%3d

但是当param = 2和KEY = mcbgp23njwmcinu0tij05vc2时,此函数会返回UhMZc7/MNK8=

因此格式化的网址将为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
        );
    }

1 个答案:

答案 0 :(得分:2)

问题是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,然后将其转换为字节数组。

相关问题