我試圖找到一種方法來在URL和/或cookie中放置一個數字,而目前我唯一使用的方法是使用常規十六進制編碼(00-01-...-FF
)。我打算使用Base64,但發現它在URL或Cookie中不安全。我可以使用什麼編碼來壓縮URL和Cookie安全的號碼?
什麼是類似於base64的編碼我可以使用的是URL和cookie安全嗎? (只使用0-9,AZ,AZ)另外,他們是在.NET庫:)
我試圖找到一種方法來在URL和/或cookie中放置一個數字,而目前我唯一使用的方法是使用常規十六進制編碼(00-01-...-FF
)。我打算使用Base64,但發現它在URL或Cookie中不安全。我可以使用什麼編碼來壓縮URL和Cookie安全的號碼?
什麼是類似於base64的編碼我可以使用的是URL和cookie安全嗎? (只使用0-9,AZ,AZ)另外,他們是在.NET庫:)
爲什麼不使用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。
是不是有填充有一個原因?像這樣:http://stackoverflow.com/questions/1228701/code-for-decoding-encoding-a-modified-base64-url – Earlz
@Earlz:儘管填充在一般情況下很重要,但沒有理由如果你知道你的數據有多長。編碼32位值的Base64將始終需要填充字符。既然您知道填充字符將始終是必需的,只要您在解碼之前仔細添加填充字符,就沒有理由不刪除它。 –
@Earlz:在我的答案結尾處查看更新。 –
要實現此操作的簡單方法,請使用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
是 「一把手」 總是整數? –
客戶是否需要解碼數字,或者這只是爲了乘坐?您可以隨時[UrlEncode](http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx)生成Base64'd字符串。 (我在傳遞加密數據時使用了這種方法) – Joshua
@Josh我只是寧願不要浪費空間(並使事情變得醜陋)通過URL編碼。和山姆沒有,這是不同的字節數 – Earlz