2016-06-19 22 views
2

ランダムな文字を取得する方法を探しています。文字列に2つ以上の大文字、少なくとも1つの数字と特殊文字を含める必要があります。彼らがいない特殊文字と数字を持っているC#RNGCryptoServiceProviderと特殊文字

ZNQzvUPFKOL3x

BQSEkKHXACGO

public static string CreateRandomPassword(int Length) 
{ 
    string _Chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ[_!23456790"; 
    Byte[] randomBytes = new Byte[Length]; 
    var rng = new RNGCryptoServiceProvider(); 
    rng.GetBytes(randomBytes); 
    var chars = new char[Length]; 
    int Count = _Chars.Length; 

    for(int i = 0;i<Length;i++) 
    { 
     chars[i] = _Chars[(int)randomBytes[i] % Count]; 
    } 
    return new string(chars); 
} 

いくつかの結果: はここに私のコードです。

+1

チャンスは[ '(非常に低いです_ ! ')。 – khlr

+0

小文字アルファベット、大文字のアルファベット、数字、特殊文字の分離された文字列....これらの文字列のランダムなセットを生成し、それらをランダムな方法で混合します。 (良い方法があるかもしれません) –

+0

あなただけの努力を保存し、guidを使用するかもしれません。長さのために道がランダムになり、人間が覚えていることも同様に不可能です。 –

答えて

1

あなたのコードは素晴らしいです!私はちょうどあなたの条件を検証する関数でそれをラップしました。

私は次のことを実行しました:あなたのアルファベットはちょうどそれらの3を提供して特殊文字と文字列(?パスワード)を作成するためにあなたのアルゴリズムのための

public static string CreateRandomPassword(int Length) 
    { 
     string _Chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ[_!23456790"; 
     Byte[] randomBytes = new Byte[Length]; 
     var rng = new RNGCryptoServiceProvider(); 
     rng.GetBytes(randomBytes); 
     var chars = new char[Length]; 
     int Count = _Chars.Length; 

     for (int i = 0; i < Length; i++) 
     { 
      chars[i] = _Chars[(int)randomBytes[i] % Count]; 
     } 
     return new string(chars); 
    } 

    public static string CreateRandomPasswordWith2UpperAnd1NumberAnd1Special(int length) 
    { 
     while (true) 
     { 
      var pass = CreateRandomPassword(length); 
      int upper=0, num =0, special = 0,lower=0; 
      foreach (var c in pass) 
      { 
       if (c > 'A' && c < 'Z') 
       { 
        upper++; 
       } 
       else if (c > 'a' && c < 'z') 
       { 
        lower++; 
       } 
       else if (c > '0' && c < '9') 
       { 
        num++; 
       } 
       else 
       { 
        special++; 
       } 
      } 
      if (upper>=2&&num>=1&&1>=special) 
      { 
       return pass; 
      } 
     } 
    } 

    [Test] 
    public void CreateRandomPassword_Length13_RandomPasswordWithNumbers() 
    { 
     var random = CreateRandomPasswordWith2UpperAnd1NumberAnd1Special(13); 
     Assert.IsTrue(true); 
    } 
+0

ありがとうございます。完璧です。あなたのコードは私に強力なパスワードを与えてくれました。置換else {特殊++; } with} else if(c == '[' || c == '_' || c == '!'){special ++; }を使って特殊文字を取得します。 – Jandy

+0

あなたがそれを使っているなら、他に何もできないので特別なことを確認する必要はありません。 – silver

+0

else if(c == '[' || c == '_' || c == '!'){特別++; }それはたくさんの記憶を取る。 – Jandy