2011-11-16 47 views
2

我試圖找到一種方法來在URL和/或cookie中放置一個數字,而目前我唯一使用的方法是使用常規十六進制編碼(00-01-...-FF)。我打算使用Base64,但發現它在URL或Cookie中不安全。我可以使用什麼編碼來壓縮URL和Cookie安全的號碼?

什麼是類似於base64的編碼我可以使用的是URL和cookie安全嗎? (只使用0-9,AZ,AZ)另外,他們是在.NET庫:)

+0

是 「一把手」 總是整數? –

+1

客戶是否需要解碼數字,或者這只是爲了乘坐?您可以隨時[UrlEncode](http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx)生成Base64'd字符串。 (我在傳遞加密數據時使用了這種方法) – Joshua

+0

@Josh我只是寧願不要浪費空間(並使事情變得醜陋)通過URL編碼。和山姆沒有,這是不同的字節數 – Earlz

回答

1

爲什麼不使用Base64編碼,但+/字符轉換爲-編碼的編碼器/解碼器加分和_,分別?有關說明,請參閱http://en.wikipedia.org/wiki/Base64#Variants_summary_table

這是相當常用的,也許最有名的是YouTube的視頻ID。

該代碼把一個64位的值成base64編碼密鑰,使用該轉換:

public static string Base64EncodeKey(ulong key) 
    { 
     // get bytes 
     byte[] keyBytes = BitConverter.GetBytes(key); 

     // get base64 value 
     string keyString = Convert.ToBase64String(keyBytes); 

     // The base64 encoding has a trailing = sign, and + and - characters. 

     // Strip the trailing =. 
     keyString = keyString.Substring(0, keyString.Length - 1); 

     // convert + to - (dash) and/to _ (underscore) 
     keyString = keyString.Replace('+', '-'); 
     keyString = keyString.Replace('/', '_'); 

     return keyString; 
    } 

反向轉動編碼鍵回ulong

public static ulong Base64DecodeKey(string keyString) 
    { 
     // convert - to +, and _ to/
     keyString = keyString.Replace('-', '+'); 
     keyString = keyString.Replace('_', '/'); 

     // add the trailing = 
     keyString += '='; 

     // convert to bytes 
     byte[] keyBytes = Convert.FromBase64String(keyString); 

     // get the encoded key 
     ulong encodedKey = BitConverter.ToUInt64(keyBytes, 0); 
     return encodedKey; 
    } 

可以做與32位密鑰類似的東西。

更新:

我看到你說有不同數量的字節。如果您知道該值始終爲32位或更少(或64位或更少),那麼使用上述技術可能會更好。如果您確實需要編碼不同長度的字符串,則仍然可以使用經過修改的base64編碼方案,該方案用-_替代+/。其他建議見RFC 4648

+0

是不是有填充有一個原因?像這樣:http://stackoverflow.com/questions/1228701/code-for-decoding-encoding-a-modified-base64-url – Earlz

+0

@Earlz:儘管填充在一般情況下很重要,但沒有理由如果你知道你的數據有多長。編碼32位值的Base64將始終需要填充字符。既然您知道填充字符將始終是必需的,只要您在解碼之前仔細添加填充字符,就沒有理由不刪除它。 –

+0

@Earlz:在我的答案結尾處查看更新。 –

0

要實現此操作的簡單方法,請使用HttpServerUtility.UrlTokenEncode()和UrlTokenDecode()。

byte[] plainTextBytes = Encoding.UTF8.GetBytes(originalString); 
string encodedString = HttpServerUtility.UrlTokenEncode(plainTextBytes); 


byte[] decodedBytes = HttpServerUtility.UrlTokenDecode(encodedString); 
string originalStringCopy = Encoding.UTF8.GetString(decodedBytes); 

感謝弗雷德裏克Haglund在這裏他的答案:https://stackoverflow.com/a/1789179/24315