c# - 随机字符串 |密码加盐建议

标签 c# string random passwords salt

如果我们将我的方法与 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/

相关文章:

C# 为什么我不应该使用协程?

random - 如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?

Javascript 两个数字之间的随机整数

c++ - 给定种子和偏移量生成下一个伪随机值

c++ - 我的程序因为检测到问题而停止工作?

c# - System.Threading 回调似乎不太准确

c# - .Net 处理非托管内存的方式是否不同于 C++ 运行时/二进制可执行文件?

c# - 没有端点监听 wcf/rest

javascript - 如何提取数字类型的最后一个字符 javascript/jquery

string - Delphi:在字符串中执行条件语句