【问题标题】:Random String | Password Salt Suggestion随机字符串 |密码盐建议
【发布时间】:2014-07-02 09:36:55
【问题描述】:

如果我们将下面我的方法与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 在其构造函数中使用种子。当提供相同的种子时,.Next() 函数返回相同的数字集。如果种子没有插入到 Random 构造函数中,它将使用基于 DateTime.Now 的值。
  • 这是另一件需要记住的有用的事情。我使用的解决方法是一个好的解决方法吗?
  • 嗯,实际上,最好在函数RandomString 函数中创建一个新的Random 对象。它的可读性会更好,性能开销也会很小。此外,虽然这是一个技术细节,但Random 对象的寿命越长,真实随机性的下降幅度就越大。有关它的更多信息:stackoverflow.com/a/4440760/2416958 这会将您重定向到相应的文献。
  • @Stefan:我不同意在函数中创建Random 对象。这将始终根据当前时间创建一个新实例。如果您要多次实例化该类,它很可能会创建相同的种子。最好是为特定目的创建一个Random 对象,并在应用程序的整个生命周期中使用它,以确保正确分发(当然,在重复周期内)。
  • @Caramiriel:让我重新检查一下;我的信息基于伪随机算法的非真实随机性。我会坚定地承认(可能)只有当你真的很频繁地调用 .Next 函数时(比如 10 ^ 10 次)才是一个问题。如果我错了,我会尝试获取一些信息并重述。谢谢。

标签: c# string random passwords salt


【解决方案1】:

The reason I did "aAbBcC..." instead of "abc...ABC..." was to increase the chances of randomization between the lower and capital case of each letter since they are next to each other. 这不会增加大小写之间的随机性。

你可以用骰子来测试,数字的位置不会改变偶数和奇数的几率。

efficiency 将取决于您如何定义它。您希望您的代码或多或少具有可读性吗?您需要高性能吗?可维护性?

在正常情况下,我不会更喜欢一个。

Is it best to keep duplicate characters or should I make sure that each character is only encountered once per salt?

实际上,如果允许双字符,排列的数量会增加。

这意味着字符串在暴力攻击中将更难破解。

如果您将此盐用于加密技术,最好使用框架的库。赞GetBytes()

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx

【讨论】:

  • 我认为它会增加随机性的原因是因为我不太信任 Random 库的随机性。我也不太明白它是如何工作的,这让我很困扰。我在学校被教导说,如果你的代码很容易被其他程序员阅读,那么它就是一段很好的代码。你有什么意见?我宁愿在安全、快速和更少的资源使用之间取得平衡。在与要散列和/或加密的字符串混合和/或加密之前,所有内容都转换为字节数组。这是图书馆要求我做的事情。
  • 随机性非常好(这是轻描淡写)。好的可读代码通常是好的代码的最佳标准(只要它也是合乎逻辑的)。尽管在超高性能环境中,稍微调整一下代码可能会更好,例如重用对象、避免循环等。与加密算法相比,代码开销很小的可能性很大。因此,除非您将代码运行数千次,否则它就足够了。所以这取决于你:) ...我希望这会有所帮助。
【解决方案2】:

盐的主要用途是使加密更难于字典攻击。

我确实喜欢在密钥本身上制造污垢,到目前为止它非常有效,因为我在 WCF 服务上每秒运行数百次加密/解密:

// sKey being the encryption key

// adding dirt to the string to make it harder to guess using a dictionary attack.
byte[] Dirt = Encoding.ASCII.GetBytes(sKey.Length.ToString());

// The Key will be generated from the specified Key and dirt.
PasswordDeriveBytes FinalKey = new PasswordDeriveBytes(sKey, Dirt);

// to use : FinalKey.GetBytes(16)

【讨论】:

  • 啊,我明白了。不过,我宁愿泥土多变一些。但这就是我的看法。谢谢你的回答!我很确定这些知识将来会派上用场。
猜你喜欢
  • 2012-08-05
  • 2013-12-04
  • 1970-01-01
  • 2015-05-23
  • 2010-10-06
  • 1970-01-01
  • 2011-04-30
  • 2016-07-08
  • 2014-02-16
相关资源
最近更新 更多