我可以使用什么编码来压缩URL和Cookie安全的数字?

时间:2011-11-16 18:25:01

标签: .net encoding base64

我正在尝试找到一种方法在URL和/或cookie中放置一个数字,目前我唯一的方法是使用常规十六进制编码(00-01-...-FF)。我打算使用Base64,但发现它在URL或cookie中不安全。

什么是类似于base64的编码我可以使用URL和cookie安全吗? (仅使用0-9,a-z,A-Z)另外,它们是.Net库中编码的编码器/解码器的奖励积分:)

2 个答案:

答案 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