首页 / C#开发 / 正文

C#/.NET应用程序编程开发中生成随机密码的方式有哪些,你更喜欢哪种生成随机密码的方式?

3746 1 发布于: 2019-06-28 读完约需8分钟

问题描述

在C#/.NET应用程序编程开发中可能会有如下场景:在一个应用程序中,当用户忘记自己的登录密码时,需要系统为其生成一个临时的随机密码,然后用户用这个临时密码登录系统,之后再修改一个成自己容易记住的密码。

在这个过程中,如何使用C#为用户生成临时的随机密码呢?有哪些生成随机密码的方式呢?

方案一

使用.NET内置的命名空间System.Web.Security中的Membership.GeneratePassword()方法生成随机密码,如下:

var password = Membership.GeneratePassword(10, 0);
Console.WriteLine(password);

请在项目中引用命名空间System.Web.Security

方案二

使用Random封装一个生成随机密码的方法,如下:

public string CreatePassword(int length)
{
    const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    StringBuilder res = new StringBuilder();
    Random rnd = new Random();
    while (0 < length--)
    {
        res.Append(valid[rnd.Next(valid.Length)]);
    }
    return res.ToString();
}

如果需要在生成出来的随机密码(字符串)中包含特殊字符,请在valid中添加特殊字符。

方案三

使用Guid.NewGuid()生成随机Guid,然后再截取想要的位数的字符串作为随机密码,生成一个8位的随机密码如下:

var password = Guid.NewGuid().ToString("d").Substring(0, 8);

此方法生成出来的随机密码(字符串不包含特殊字符串)

方案四

使用RNGCryptoServiceProvider类来生成随机性更高的随机密码(字符串),封装一个生成随机密码的方法,如下:

using System;
using System.Security.Cryptography;

public static string GetRandomAlphanumericString(int length)
{
    const string alphanumericCharacters =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
        "abcdefghijklmnopqrstuvwxyz" +
        "0123456789";
    return GetRandomString(length, alphanumericCharacters);
}

public static string GetRandomString(int length, IEnumerable<char> characterSet)
{
    if (length < 0)
        throw new ArgumentException("length must not be negative", "length");
    if (length > int.MaxValue / 8) // 250 million chars ought to be enough for anybody
        throw new ArgumentException("length is too big", "length");
    if (characterSet == null)
        throw new ArgumentNullException("characterSet");
    var characterArray = characterSet.Distinct().ToArray();
    if (characterArray.Length == 0)
        throw new ArgumentException("characterSet must not be empty", "characterSet");

    var bytes = new byte[length * 8];
    new RNGCryptoServiceProvider().GetBytes(bytes);
    var result = new char[length];
    for (int i = 0; i < length; i++)
    {
        ulong value = BitConverter.ToUInt64(bytes, i * 8);
        result[i] = characterArray[value % (uint)characterArray.Length];
    }
    return new string(result);
}

方案五

使用RNGCryptoServiceProvider类的简易实现方式,如下:

public string GenerateToken(int length)
{
    RNGCryptoServiceProvider cryptRNG = new RNGCryptoServiceProvider();
    byte[] tokenBuffer = new byte[length];
    cryptRNG.GetBytes(tokenBuffer);
    return Convert.ToBase64String(tokenBuffer);
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: ASP.NET Core应用程序编程开发中如何从querystring中获取参数和对应参数值?

下一篇: ASP.NET MVC Web应用程序如何从控制器返回图片类型?

本文永久链接码友网 » C#/.NET应用程序编程开发中生成随机密码的方式有哪些,你更喜欢哪种生成随机密码的方式?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册