2010-04-12 4 views
32

Memberhip.GeneratePassword를 사용하여 알파 또는 숫자 만 포함 된 암호를 반환하려면 어떻게해야합니까? 기본 방법은 영숫자가 아닌 암호의 최소 수와 최대 수만을 보장합니다.회원 비밀번호 생성 영숫자 전용 비밀번호?

+0

왜이 작업을 수행 하시겠습니까? 특수 문자는 비밀번호에 포함 된 것이 좋습니다. 내 이해력을 초월한 기괴한 이유로 당신이 정말로 하나를 원한다면 GeneratePassword를 사용하지 않고 직접 생성하는 방법을 작성하십시오. –

+20

한 가지 이유는 생성 된 암호가 실제로 세계화가 용이하지 않기 때문입니다. 또 다른 이유는 애플리케이션을 사용하는 CEO가 못 생기면서도 보안이 유지되는 암호를 사용하여 화를 냈고 암호를 변경했다고 말했습니다. – Greg

+0

또는 내 경우에는 구두점이 내가 호출하는 API에서 서버 오류를 일으키는 것입니다. – Drew

답변

52
string newPassword = Membership.GeneratePassword(15, 0); 
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9"); 

이 정규 표현식은 숫자 문자 9

+0

비밀번호의 무작위성이 상당히 떨어집니다. 권장하지 않습니다. –

+11

@Matti "9"를 Random.Next (0, 9) 정수로 바꿀 수 있습니다. 영숫자가 아닌 문자를 일반적인 암호에 배치하는 것은 일반적으로 과도한 작업입니다. 단어를 사용하지 않는 무작위로 생성 된 암호는 많은 응용 프로그램에서 유용합니다. 이렇게하는 이유는 유용성입니다. 영숫자가 아닌 많은 문자는 일반 사용자가 쉽게 실수하거나 혼동 할 수 있으며 입력 할 수 없습니다. –

+0

@Matti이 코드를 사용하면 승인 된 비영 문자의 하위 집합 만 삽입 할 수도 있습니다. 나는 많은 응용 프로그램에 대한 필요성을 보지 못합니다. –

13

으로 GUID를 생성하고 기초로 그것을 사용하는 것입니다 8 영숫자 암호를 얻을 수있는 간단한 방법을 모든 영숫자가 아닌 문자를 대체합니다 :

string newPwd = Guid.NewGuid().ToString().Substring(0, 11); 
newPwd = newPwd.Substring(0, 8) + newPwd.Substring(9, 2); // to skip the dash. 
: 당신이 더 긴 암호가 필요하다면
string newPwd = Guid.NewGuid().ToString().Substring(0, 8); 

, 단지 문자열을 사용하여 대시를 건너

첫 번째 문자가 알파인지 확인하려는 경우 (newPwd [0]> = '0'& & newPwd [0] < = '9')와 같이 필요하면 고정 된 문자열로 바꿀 수 있습니다.

다른 사람에게 도움이되기를 바랍니다. :-)

+4

이것은 좋은 생각이 아닙니다. 하나는 가능한 문자 세트를 36으로 줄이는 것입니다 (36 대신). 다른 경우 guid는 반드시 임의적 인 것은 아니며 guid를 생성하는 방법에 따라 생성하는 비밀번호를 쉽게 예측할 수 있습니다. 나는 이것에 대한 더 많은 정보를 얻기 위해 guids가 어떻게 작동하는지 에릭 Lippert의 시리즈를 강력히 추천한다 : http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx –

0

나는 또한 GUID 방법을 선호 - 여기에 짧은 버전입니다 :

string password = Guid.NewGuid().ToString("N").Substring(0, 8); 
+4

효과적으로 Laura와 똑같은 정답. 아무 이유없이 문자열 형식이 지정됩니다 (효과가 없음). –

10

내가이 일을하는 방법이있을 수 있다는 것을 깨달았다. GUID 메서드는 대문자와 소문자가 섞이지 않는 것을 제외하고는 훌륭합니다. 제 경우에는 소문자 만 작성했습니다.

그래서 Regex를 사용하여 비 - 알파 (alphas)를 제거한 다음 결과가 필요한 길이로 부분 문자열을 만들기로 결정했습니다.

string newPassword = Membership.GeneratePassword(50, 0); 

newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => ""); 

newPassword = newPassword.Substring(0, 10); 
+0

감사합니다. 내 프로젝트에서 사용했습니다. –

+2

생성 된 초기 암호에는 10 자 미만의 영숫자가 포함될 수 있으므로 Substring() 메서드에 의해 Throw되는 ArgumentOutOfRangeException()이 발생할 가능성이 있습니다. – Chris

+0

@Chris와 다른 것을 구합니다. 'Membership.GeneratePassword'의 50은'MaxLength'뿐만 아니라 패스워드의 길이를 지정합니다. – SollyM

1

원하는 암호 길이에 도달 할 때까지 암호를 생성하고 영숫자가 아닌 문자를 연결하려고 할 수도 있습니다.

public string GeneratePassword(int length) 
{ 
    var sb = new StringBuilder(length); 

    while (sb.Length < length) 
    { 
     var tmp = System.Web.Security.Membership.GeneratePassword(length, 0); 

     foreach(var c in tmp) 
     { 
      if(char.IsLetterOrDigit(c)) 
      { 
       sb.Append(c); 

       if (sb.Length == length) 
       { 
        break; 
       } 
      } 
     } 
    } 

    return sb.ToString(); 
} 
0

breigo의 솔루션과 비슷한 접근법이 있습니다. 아마도 그렇게 효과가 없지만 명확하고 짧음

string GeneratePassword(int length) 
{ 
    var password = ""; 
    while (password.Length < length) 
    { 
      password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit)); 
    } 
    return password; 
} 
관련 문제