.NET C#重置密码 - 随机!

时间:2010-02-16 09:44:33

标签: c# .net

我已经完成了常规的Google搜索,我认为我说在.NET Framework中没有随机密码生成器是正确的。目的是为忘记用户重置AD中的密码。

这在渗透测试的下一阶段肯定会成为一个问题。我想避免回答“哦,是的,我只是敲了我自己的发电机东西”。

有什么建议?当然,我不能依赖.NET Random类和一个字符数组。

干杯。

3 个答案:

答案 0 :(得分:13)

虽然依赖Random来处理与安全相关的任何事情,但您可以使用RNGCryptoServiceProvider生成构建新密码所需的随机数据

此外,实际上 BCL中用于生成随机密码的方法,但它隐藏在System.Web程序集中。静态方法Membership.GeneratePassword可以生成由调用者指定的密码长度。

  

GeneratePassword方法用于生成随机密码,并且最常由成员资格提供程序实施的ResetPassword方法用于将用户的密码重置为新的临时密码。

     

生成的密码仅包含字母数字字符和以下标点符号:!@#$%^& *()_- + = [{]};:<> | ./?。生成的密码中不包含隐藏或不可打印的控制字符。

该文档似乎不包含有关如何创建密码的任何信息,但source code is available可供您查看。

答案 1 :(得分:4)

如果你真的想要真正的随机性,你应该使用RNGCryptoServiceProvider类而不是Random来完成这些任务。以下是how to create a random password in .NET的示例。

答案 2 :(得分:2)

这是一个生成简单记忆密码的功能。可能对重置密码或创建初始密码很有用,而不是要求用户在注册时键入密码。

    // Creates fairly easy-to-remember random passwords, consisting of 
    // three syllables (consonnant + vowel) and two digits at the end.
    // A total of 172'800'000 combinations is possible.
    public static string GeneratePassword()
    {
        const string consonnants = "bcdfghjklmnpqrstvwxz";
        const string vowels = "aeiouy";

        string password = "";
        byte[] bytes = new byte[4];
        var rnd = new RNGCryptoServiceProvider();
        for (int i=0; i<3; i++)
        {
            rnd.GetNonZeroBytes(bytes);
            password += consonnants[bytes[0]*bytes[1] % consonnants.Length];
            password += vowels     [bytes[2]*bytes[3] % vowels.Length];
        }

        rnd.GetBytes(bytes);
        password += (bytes[0] % 10).ToString() + (bytes[1] % 10).ToString();
        return password;
    }

这会产生如下密码:

bavara11
baqovi84
namana07
cyluha55
vobana18
qanabi05
bukinu09
gapupa29

P.S。这些可能不是世界上最安全的密码,但我敢说,这些密码比人们在互联网上使用的密码要强得多。