我正在创建一个生成随机数的密码生成器,然后我使用ascii将其转换为一个字母。在for循环中,我需要字母来转换字符串而不是列表。它可以工作,但它只是将随机字母显示为列表。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
class MainClass
{
static void Main()
{
int x = 1;
int length;
string a = "Press any key to continue";
object num;
while (x == 1)
{
Console.WriteLine("How many Characters would you like the Password to be? (Press -1 to Stop)");
length = Convert.ToInt32(Console.ReadLine());
try
{
for (int i = 0; i < length; i++)
{
int num1 = Number();
Int32 ASCII = num1;
num = (char)num1;
if (length > 0)
{
Console.WriteLine(num);
}
}
}
catch
{
Console.WriteLine(a);
}
if (length == -1)
break;
}
}
static Random _r = new Random();
static int Number()
{
return _r.Next(65, 90); // decimal
}
}
答案 0 :(得分:16)
StringBuilder sb = new StringBuilder();
for( int i = 0; i < length; i++ )
{
int num1 = Number();
Int32 ASCII = num1;
num = (char)num1;
sb.Append( num );
}
Console.WriteLine( sb.ToString() );
这不是我如何构建密码,也不是我如何生成随机文本,但这会给你一个字符串并回答原始问题。
关于我 如何执行此任务:
System.Security.Cryptography.RNGCryptoServiceProvider _crypto = new System.Security.Cryptography.RNGCryptoServiceProvider();
byte[] bytes = new byte[8]; // this array can be larger if desired
_crypto.GetBytes( bytes );
ulong randomNumber = (ulong)BitConverter.ToInt64( bytes, 0 );
// convert to a string with the encoding of your choice; I prefer Base 62
为了完整起见,这是我使用的Base62算法。 Base62比更常用的Base64具有优势,因为它不包含任何特殊字符,因此它易于在查询字符串,HTML和JavaScript中使用(有一些小的警告)。当然,密码不应该在任何这些地方使用,并且您可能想要包含特殊字符以使密码更复杂。
无论如何,这是我如何将随机数转换为Base62。
private static readonly char[] _base62Characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
public static string ToBase62String( long value )
{
if( value < 0L )
{
throw new ArgumentException( "Number must be zero or greater." );
}
if( value == 0 )
{
return "0";
}
string retVal = "";
while( value > 0 )
{
retVal = _base62Characters[value % 62] + retVal;
value = value / 62;
}
return retVal;
}
最后,我想指出,很少会出于任何目的生成密码,因为这意味着它们是以某种形式分发的。密码应该是哈希和腌制的;密码重置应依赖于随机,过期的安全令牌,允许用户进行一次性重置。密码不应该通过电子邮件发送给用户;密码绝不应以明文或任何可逆格式存储。
对于密码重置令牌生成,我提供的代码可以很好地工作,因为它生成一个用Web安全格式编码的大型加密随机数。但在这种情况下,即使是一个哈希的GUID也可以做到这一点。
答案 1 :(得分:6)
var sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.Append((char)Number());
}
string password = sb.ToString();
Console.WriteLine(password );
但我会将您的Number()方法更改为:
private static char GetRandomChar()
{
return (char)_r.Next(65, 90);
}
然后替换循环内的行:
sb.Append(GetRandomChar());
答案 2 :(得分:3)
//You have to append the values generated by the RandomNumber in to your password variable
class MainClass
{
static void Main()
{
int x = 1;
int length;
string a = "Press any key to continue";
string num=string.Empty;
while (x == 1)
{
Console.WriteLine("How many Characters would you like the Password to be? (Press -1 to Stop)");
length = Convert.ToInt32(Console.ReadLine());
try
{
for (int i = 0; i < length; i++)
{
int num1 = Number();
Int32 ASCII = num1;
num =num+ ((char)num1);
}
Console.WriteLine(num);
}
catch
{
Console.WriteLine(a);
}
if (length == -1)
break;
}
}
static Random _r = new Random();
static int Number()
{
return _r.Next(65, 90); // decimal
}
}
答案 3 :(得分:2)
你可以尝试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PasswordSample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Generated password: {0}", GeneratePassword(12, true));
}
/// <summary>
/// Generate a random password
/// </summary>
/// <param name="pwdLenght">Password lenght</param>
/// <param name="nonAlphaNumericChars">Indicates if password will include non alpha-numeric</param>
/// <returns>Return a password</returns>
private static String GeneratePassword(int pwdLenght, bool nonAlphaNumericChars)
{
// Allowed characters
String allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
if (nonAlphaNumericChars)
{
// Add non-alphanumeric chars
allowedChars += "-&@#%!*$?_";
}
char[] passwordChars = new char[pwdLenght];
Random rnd = new Random();
// Generate a random password
for (int i = 0; i < pwdLenght; i++)
passwordChars[i] = allowedChars[rnd.Next(0, allowedChars.Length)];
return new String(passwordChars);
}
}
}
答案 4 :(得分:1)
只需在int x附近定义一个字符串... 喜欢 String Password =“”;
并在if语句中附加了keyyword。
if (length > 0)
{
Console.WriteLine(num);
Password+=num
}
答案 5 :(得分:0)
当我必须创建一个生成随机密码的方法时,我发现以下帖子很有用: https://stackoverflow.com/a/730352/1015289
然而,当我想创建一个简短的验证时间。样式代码将通过电子邮件发送给用户以确认其详细信息,我想将验证代码限制为仅8个字符。
为此,我使用了以下内容:
string validationCoce = Guid.NewGuid()。ToString()。Substring(0,8);
这将存储在一个数据库中,该数据库还保存用户的电子邮件,这些数据库在出于安全目的存储之前都已加密。
电子邮件和验证码都需要验证用户帐户。
希望上述任何一种帮助?
亲切的问候,韦恩
答案 6 :(得分:-1)
使用Console.Write()代替Console.WriteLine(),否则附加到某些字符串并在循环外打印