获取salt
第一种方法:通过随机数筛出64位无规则数字(包含数字,大写字母,小写字母)
public string GetSalt()
{
//定义salt;
string salt = "";
//随机数
Random random = new Random();
//确定位数64位
for (int i = 0; i < 64; i++)
{
//定义每一个字符的类型(0为数字0-9,1为A-Z,2为a-z)
int key = random.Next(3);
switch (key)
{
case 0:
int code1 = random.Next(10);
salt += code1;
break;
case 1:
char code2 = (char)(random.Next(26) + 65);
salt += code2;
break;
case 2:
char code3 = (char)(random.Next(26) + 97);
salt += code3;
break;
}
}
return salt;
}
第二种方法:通过Guid.NewGuid()来获取salt
通过该方法可以获取32位的小写字母和数字组合的数字
关于Guid.NewGuid()的介绍
public string GetSalt2()
{
string salt2 = Guid.NewGuid().ToString("N");
return salt2;
}
说明符 | 返回值的格式 |
---|---|
N | 32 位 |
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | |
D | 由连字符分隔的 32 位数字 |
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | |
B | 括在大括号中、由连字符分隔的 32 位数字 |
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} | |
P | 括在圆括号中、由连字符分隔的 32 位数字 |
(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) |
第三种方法:通过RNGCryptoServiceProvider()方法获取salt
参考:C#使用 RNGCryptoServiceProvider 生成强随机字符串
private static RNGCryptoServiceProvider _random = new RNGCryptoServiceProvider();
public string GetSalt3()
{
return GetRandomString();
}
public string GetRandomString()
{
//定义字母表
string key = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
int length = key.Length;
StringBuilder sb = new StringBuilder(length);
//定义salt长度
for (int i = 0; i < 64; i++)
{
sb.Append(key[SetRandomSeeds(length)]);
}
return sb.ToString();
}
public int SetRandomSeeds(int length)
{
decimal maxValue = long.MaxValue;
byte[] array = new byte[8];
_random.GetBytes(array);
return (int)(Math.Abs(BitConverter.ToInt64(array,0)) / maxValue * length);
}
sha256非对称加密
public string GetSha256(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str):
byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
StringBuilder builder1 = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
builder1.Append(hash[i].ToString("X2"));
}
return builder1.ToString();
}
加密方式:
string salt = GetSalt();
string encrypted_password = GetSha256(GetSha256(pwd)+salt);
存入数据库
将用户名和加密后的密码(encrypted_password)存入user表中,salt单独存储至salt表,掌握它们的对应关系。
登录
点击登录按钮,获取窗体中用户名,并与数据库user表中用户名对应,若没有,返回“用户名或密码错误”,否则,查出对应 salt 值。并获取窗体中的密码(明文),让其以上述加密方式进行加密得到的值与数据库中user表中的(encrypted_password)对照,错误返回“用户名或密码错误”,正确则登录成功。