2

我有一个应该为我生成 64 字节(512 位)盐的方法:

public static string GenerateSalt()
{
    var rngCrypto = new RNGCryptoServiceProvider();
    byte[] saltBytes = new byte[64];
    rngCrypto.GetBytes(saltBytes);

    string result = Convert.ToBase64String(saltBytes);

    return result;
}

这似乎运行良好,saltBytes字节数组的大小为 64 字节。但是,我无法在包含char(64)类型列的 MS SQL 数据库表中输入结果。

我的假设是,该Convert.ToBase64String(saltBytes);方法对我来说是错误的,但我想知道如何改进它。快速浏览System.Text.ASCIIEncoding.Unicode.GetByteCount(secondSalt);显示字符串大小为 176 字节而不是 64 字节。

4

2 回答 2

3

当您从 64 字节(512 位)开始,然后转换为基数 64 时,每个字节仅存储 6 位,因此您需要上限(512/6)= 86 字节来存储结果(不确定您的 176字节来自虽然)。

于 2013-04-10T22:18:49.877 回答
3

字节数组在逻辑上是以 256 为基数的数字。将其转换为以 64 为基数的数字会使其更长。就像从十六进制 F0 转换为二进制 1111111100000000 一样,它会变长。

如果您想以人类可读的 base-64 编码字符串将 salt 存储在数据库中,那么它必须比 64 个单字节字符长得多。

至于通过 ASCII 编码器运行它——我不知道你想在这里做什么。对于非文本数据,这听起来很奇怪。你可以解释吗?

于 2013-04-10T22:20:44.357 回答