在System.Security.Cryptography中加密到字母数字

时间:2010-02-04 04:51:43

标签: .net cryptography query-string

我有一个需要加密客户ID的项目。加密值用作网站的查询字符串值,然后返回个性化表单以供完成。

我遇到的问题是我们正在使用的网站有一个安全策略,该策略禁止查询字符串中的非字母数字字符。

我目前正在尝试确认哪些字符被阻止,但理想的解决方案是使用加密算法返回字母数字字符串。

我还没有在System.Security.Cryptography命名空间中找到任何这样的算法 - 显然是因为密钥大小通常是64位或者是某个倍数 - 但我希望这样的算法可用。

在这个阶段唯一的选择是将其他允许的字符换成任何被认为是非法的字符,但我认为我不会有足够的允许字符来使用它。

是否有任何经验或有关如何进行的建议?

2 个答案:

答案 0 :(得分:3)

您只需要在任意字节(加密算法的输出)和允许集中的字符之间创建可逆映射。

Base64的工作原理如下 - 它将任意二进制文件编码为集合[A-Za-z0-9+/]中的字符(这几乎正是您想要的,添加了+/)。您可以使用Base64编码,然后将+/替换为另外两个“允许的字符”,如果有的话(可能是-_?)。

应该以您的语言提供现有的Base64编码和解码功能。

答案 1 :(得分:1)

加密(或者在这种情况下更可能是哈希)将返回一个字节数组。将字节值转换为十六进制字符串并将其传递。

private static string ByteArrayToHexString(byte[] byteArray)
{
    string result = string.Empty;

    foreach (byte outputByte in byteArray)
    {
        result += outputByte.ToString("x2");
    }
    return result;
}

然后从十六进制字符串转换回字节数组

private static byte[] HexStringToByteArray(String hexString)
{
    int stringLength = hexString.Length;
    byte[] bytes = new byte[stringLength / 2];

    for (int i = 0; i < stringLength; i += 2)
    {
        bytes[i / 2] = System.Convert.ToByte(hexString.Substring(i, 2), 16);
    }
    return bytes;
}

使用这些方法可以确保您传递的唯一值是十六进制(0123456789ABCDEF)