如果我们将我的方法与 this answer 中 RCIX 的方法进行比较,哪个更有效,为什么?
private string RandomString(int length = 25)
{
const string chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789#@%&";
StringBuilder sbSalt = new StringBuilder();
for (int i = 0; i < length; i++)
{
int inx = 0;
inx = rnd.Next(0, chars.Length);
sbSalt.Append(chars[inx]);
}
return sbSalt.ToString();
}
private Random rnd = new Random();
我使用“aAbBcC...”而不是“abc...ABC...”的原因是为了增加每个字母的小写和大写之间随机化的机会,因为它们彼此相邻。
此外,对于密码盐,最好保留重复字符还是我应该确保每个字符在每个盐中只遇到一次?话又说回来,如果我允许重复字符,可以生成的盐组合量更大。
提前致谢!
更新#1:
我意识到,如果我再次调用 RandomString 函数,它会返回完全相同的随机字符串,因此为了解决这个问题,我将 rnd 移到函数外,只将其声明为新的 Random 一次。
最佳答案
我使用“aAbBcC...”而不是“abc...ABC...”的原因是为了增加每个字母的小写和大写之间随机化的机会,因为它们是相邻的other.
这不会增加大小写之间的随机性。
你可以用一个骰子来测试一下,数字的位置不会改变偶数和奇数的几率。
效率
将取决于您如何定义它。您希望您的代码更具可读性还是更差?您需要高性能吗?可维护性?
在正常情况下,我不会偏爱其中一个。
是最好保留重复字符还是我应该确保每个字符在每个 salt 中只遇到一次?
实际上,如果允许使用双字符,排列的数量会增加。
这意味着字符串在暴力攻击中将更难破解。
如果您将这种盐用于加密技术,最好使用框架的库。比如 GetBytes()
:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx
关于c# - 随机字符串 |密码加盐建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23652825/