使用 for 循环生成密码

本文关键字:密码 循环 for 使用 | 更新日期: 2023-09-27 18:18:04

我正在制作一个生成随机数的密码生成器,然后我使用 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
    }
}

使用 for 循环生成密码

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 算法。与更常用的 Base64 相比,Base62 的优势在于它不包含任何特殊字符,因此很容易在查询字符串、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 也可以解决问题。

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());
//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
    }
}

你可以试试这个

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);
        }
    }
}

只需在 int x 附近定义一个字符串...喜欢 字符串密码 = ";

并在 if 语句中附加关键字。

if (length > 0)
{
Console.WriteLine(num);
Password+=num
}
当我

必须创建一个方法来生成随机密码时,我发现以下帖子很有用:https://stackoverflow.com/a/730352/1015289

但是,当我想创建一个简短的"验证"样式代码并通过电子邮件发送给用户以确认他们的详细信息时,我想将验证代码限制为仅 8 个字符。

为此,我使用了以下内容:

字符串验证Coce = Guid.NewGuid((。ToString((.子字符串(0, 8(;

这将存储在一个数据库中,该数据库还保存用户的电子邮件,出于安全目的,两者都在存储之前进行了加密。

需要电子邮件和验证代码来验证用户帐户。

希望以上任何一项都有帮助?

亲切的问候,韦恩

使用 Console.Write((

而不是 Console.WriteLine(( 否则附加到某个字符串并在循环外打印