我正在尝试找到一种方法在URL和/或cookie中放置一个数字,目前我唯一的方法是使用常规十六进制编码(00-01-...-FF
)。我打算使用Base64,但发现它在URL或cookie中不安全。
什么是类似于base64的编码我可以使用URL和cookie安全吗? (仅使用0-9,a-z,A-Z)另外,它们是.Net库中编码的编码器/解码器的奖励积分:)
答案 0 :(得分: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。
答案 1 :(得分: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);
感谢Fredrik Haglund在这里的回答:https://stackoverflow.com/a/1789179/24315