问题描述
在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);
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册