2014-06-12 107 views
0

我正在使用以下加密技術來加密MVC應用程序中的查詢字符串值。URL安全參數

因此該網址會像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安全嗎?是否有任何其他好的技術來生成網址安全的加密格式?

編輯:

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 
     ); 
    } 
+0

顯示您的路線映射 –

+0

@CarlosLanderas,添加路線映射 – Billa

+0

我會使用url安全Base64編碼描述在[需要一個加密/解密方法沒有'/'在加密的字符串](http:// stackoverflow.com/questions/15109313/need-an-encryption-decryption-method-does-not-have-a-in-the-encrypted-string) – CodesInChaos

回答

2

的問題是,Base64編碼使用/和+字符,這是在URL中的特殊字符。解決這個問題的典型方法是使用經過修改的Base64編碼,將/轉換爲_,將'+'轉換爲' - '。這被稱爲「base64url」編碼。請參閱Wikipedia文章中的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,然後將其轉換爲ab yte數組。

+0

感謝Jim。你對@CodesInChaos有關AES技術的評論有什麼想法嗎? – Billa

+0

@Billa:我對加密的評論不夠了解。無論你使用哪種加密算法,你仍然需要對二進制結果進行base64編碼,這意味着你必須使用這種技術或類似的方法來映射有問題的字符。我想你可以編寫你自己的base62編碼器/解碼器,但這似乎是矯枉過正。 –