我有一个方法可以为我生成一个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字节。
答案 0 :(得分:3)
当你从64字节(512位)开始,然后转换为base 64,你每个字节只存储6位,所以你需要上限(512/6)= 86字节来存储结果(不确定)你的176字节来自哪里。)
答案 1 :(得分:3)
字节数组在逻辑上是基数256的数字。将其转换为基数为64的数字将使其更长。就像从十六进制F0转换为二进制1111111100000000时,它会变长。
如果要将数据库中的salt存储在人类可读的base-64编码字符串中,那么它必须比64个单字节字符长得多。
至于通过ASCII编码器运行它 - 我不知道你在这里尝试做什么。对非文本数据来说,这听起来很奇怪。你能解释一下吗?