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

8

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

这肯定会成为渗透测试的下一阶段的问题。我想避免回答“哦,是啊,我只是做了自己的生成器”。

有什么建议吗?我肯定不能依赖.NET Random类和字符数组。

谢谢。


为什么这个问题被投票否决了?显然有人不理解我每天处理的安全和 BS。 - youwhut
给分数加1来平衡得分。也许可以考虑更改标题和标签,因为这个问题与Active Directory并没有太多关系。 - Jørn Schou-Rode
3个回答

13

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

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

GeneratePassword方法用于生成随机密码,通常由成员资格提供程序实现的ResetPassword方法使用,以将用户的密码重置为一个新的临时密码。

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

文档似乎没有包含有关创建密码的信息,但是源代码可供查看


太好了。我就有点怀疑有什么问题,但它真的被隐藏起来了。很让人恼火的是,有人投票将这个完全有效的问题评为负分。 - youwhut

4

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

顺便说一句,这些密码可能不是世界上最安全的,但我敢打赌,它们比人们在互联网上使用的平均密码要强得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接