生成具有指定位长度的salt

时间:2013-04-10 22:14:24

标签: c# passwords cryptography salt

我有一个方法可以为我生成一个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 bytearray的大小为64字节。但是,我无法在MS SQL数据库表中输入结果,该表包含char(64)类型的列。

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

2 个答案:

答案 0 :(得分:3)

当你从64字节(512位)开始,然后转换为base 64,你每个字节只存储6位,所以你需要上限(512/6)= 86字节来存储结果(不确定)你的176字节来自哪里。)

答案 1 :(得分:3)

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

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

至于通过ASCII编码器运行它 - 我不知道你在这里尝试做什么。对非文本数据来说,这听起来很奇怪。你能解释一下吗?