(.NET)生成随机,易记的密码的简便方法

时间:2009-10-14 04:05:47

标签: c# asp.net random passwords guid

我有一个项目正在进行中,我需要将密码与项目相关联 密码应完全不连续或易于猜测,但易于记忆。

我想过做这样的事情。

string rand = System.Guid.NewGuid().ToString();
rand.Substring(0,3);

返回GUID的前4位数字。

我想知道是否有其他人有类似他们工作的东西,并且可能是比这更好的解决方案。

安全很重要,因为我们不希望人们能够猜到数字,但这不涉及金钱或个人数据,所以它不必具备NSA能力:)

谢谢你们!

7 个答案:

答案 0 :(得分:5)

人们记住单词比记住代码更好......

http://imgs.xkcd.com/comics/password_strength.png

因此,一种简单的方法是生成密码而不是乱码或代码。

最简单的方法是在数据库或字典中列出几千个单词,然后随机选择其中的3个或4个单词。

你使用的单词越多,黑客就越难以猜测--3,000个单词中的3个将是非常不可思议的,而20,000个单词中的4个将具有1,600,00,000,000,000,000个组合。

答案 1 :(得分:3)

如果您正在考虑PIN式代码,我建议使用所有数字(或可能是所有字母)而不是GUID的前四个字符。很多人都熟悉全数字的个人识别码;我怀疑在那里混入一封信可能会让他们不那么容易记住。但我没有证据支持这一点!

如果PIN足够,您可以只调用Random.Next(0,9)四次并连接结果。一定要消除“不够随机”的结果,就像所有四位数都相同!正如未知的那样,你可以从加密类中获得统计上更随机的结果,但超过四位不太重要。

答案 2 :(得分:3)

如果您想要为用户提供易于记忆的相对的内容,您可以随时使用我的PronouncablePasswords课程。

我最初将此作为一个实验,用于生成最终用户可以发音的随机密码,而不是完整的gobbledygook。当然,这会降低密码的安全性,但出于您的目的,这听起来就足够了。

该功能简单地在元音和辅音之间交替(带有一些基本的例外规则),并根据它们在英语中出现的字母选择“加权”。请注意,这绝不是完美的,但它确实做了“在锡上说的内容”!

代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace PronouncablePasswords
{
    class PasswordGenerator
    {
        //string vowels = "aeiou";
        //string consonants = "bcdfghjklmnprstvwxyz";

        /*
           The reason for the duplicate letters is to add "weighting" to certain letters to allow them more chance
           of being randomly selected.  This is due to the fact that certain letters in the English language are more
           frequently used than others.

           The breakdown of usage is as follows (from most frequent to least frequent):
            1.  E                   (7)
            2.  T                   (6)
            3.  A, O, N, R, I, S    (5)
            4.  H                   (4)
            5.  D, L, F, C, M, U    (3)
            6.  G, Y, P, W, B       (2)
            7.  V, K, X, J, Q, Z    (1)
        */

        string vowels = "aaaaaeeeeeeeiiiiiooooouuu";
        string consonants = "bbcccdddfffgghhhhjklllmmmnnnnnpprrrrrsssssttttttvwwxyyz";

        string[] vowelafter = {"th", "ch", "sh", "qu"};
        string[] consonantafter = { "oo", "ee" };
        Random rnd = new Random();

        public string GeneratePassword(int length)
        {
            string pass = "";
            bool isvowel = false;

            for (int i = 0; i < length; i++)
            {
                if (isvowel)
                {
                    if (rnd.Next(0, 5) == 0 && i<(length-1))
                    {
                        pass += consonantafter[rnd.Next(0, consonantafter.Length)];
                    }
                    else
                    {
                        pass += vowels.Substring(rnd.Next(0, vowels.Length), 1);
                    }
                }
                else
                {
                    if (rnd.Next(0, 5) == 0 && i<(length-1))
                    {
                        pass += vowelafter[rnd.Next(0, vowelafter.Length)];
                    }
                    else
                    {
                        pass += consonants.Substring(rnd.Next(0, consonants.Length), 1);
                    }
                }
                isvowel = !isvowel;
            }
            return pass;
        }
    }
}

答案 3 :(得分:2)

ASP .Net成员资格提供程序有一种生成可能有用的密码的方法。 http://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword.aspx您还可以查看提供商的源代码,了解他们在内部执行的操作http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx

答案 4 :(得分:1)

我建议使用RandomNumberGenerator类,它会比GUID生成更好的结果。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(VS.71).aspx

答案 5 :(得分:1)

您的密码必须具备哪些特性?如果您的主要标准是可记忆性,那么我会建议这样的事情:

找到一大堆英文文本,并从中获取五个或更少字母的所有独特单词。现在,对于任何特定的新密码,随机选择这些单词中的三个或四个。然后,最后添加一个随机的两位数字。

多少个密码?那么,两位数的一百,次数(不同的单词的数量)与(密码中的随机单词的数量)的幂。因此,如果您使用基数为2的日志,您将获得可能在这些密码中具有的熵 - 如果您的随机数生成器足够好。

在实践中,如果您在尝试几次密码错误后锁定帐户,那么只要存在至少几千个可能的密码,您就会有效地阻止攻击者。

答案 6 :(得分:0)

我认为实现它非常困难。