通常的讲,一个完整的系统,重要的基础核心页面共有三个,分别是:注册、登录以及系统的主页面。若是在网上随便找个网站,我相信,除去一些个别的开放性或公益性的网站,没有多少网站是缺少这三个核心页面的。相对于前几年用户注册信息的填写,现在的注册信息无疑比以前的要求更高,更需要用户提供真实可靠的信息才能完成账号的注册。以前的网站注册都是清一色“自定义式”填写,即账号、密码等数据都由用户自己输入,网站只负责接收并保存用户填写的数据,只要用户输入的信息符合规范(无特殊符号,密码要数字和字母结合等)便可注册成功。然而,现如今的网站则普遍都是通过手机号 + 短信验证码的形式进行注册,和以前相比,对用户信息的真实性要求更高。
那么问题来了,既然已经要求用户需提供真实的信息进行账号的注册,那么相对的也要对用户输入的真实信息进行加密&保护。一个网站的用户信息若是能被轻易的盗取、窥探的话,那么该网站也就废掉了一半。那么,应该如何对重要的数据信息进行加密呢?这就要用到某些加密工具类了,而AES则正是其中较为常见的信息加密工具。
首先,AES无需插件便可在ASP.NET MVC中使用,我们要做的是先在项目中创建一个专门用于存放静态(公共)类的文件夹,命名为Common,接着便可以在该文件夹中创建一份AES文件,完成后如图:
第二步,创建密钥:
此处的密钥相当于是加密压缩包,用户在注册页面中所输入的重要信息都会通过该密钥进行加密,接着我们将加密后的用户信息再存放到数据库中的话,便可大大提高用户信息的安全性。注意,密钥不可轻易改动,否则可能会使录入的用户信息无法进行登录。
第三步,获取向量:
向量是通过上一步的密钥产生的,如果说密钥是开启用户信息的钥匙,那么向量则是用户信息的保护锁。
第四步,AES加密方法:
/// 需要用到的参数
/// 《param name=“Data”>被加密的明文</param》
/// 《param name=“Key”>密钥</param》
/// 《param name=“Vector”>向量</param》
/// 《returns>密文</returns》
public static Byte[] AESEncrypt(Byte[] Data, String Key, String Vector)
{
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
Byte[] bVector = new Byte[16];
Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
Byte[] Cryptograph = null; // 加密后的密文
Rijndael Aes = Rijndael.Create();
try
{
// 开辟一块内存流
using (MemoryStream Memory = new MemoryStream())
{
// 把内存流对象包装成加密流对象
using (CryptoStream Encryptor = new CryptoStream(Memory,
Aes.CreateEncryptor(bKey, bVector),
CryptoStreamMode.Write))
{
// 明文数据写入加密流
Encryptor.Write(Data, 0, Data.Length);
Encryptor.FlushFinalBlock();
Cryptograph = Memory.ToArray();
}
}
}
catch
{
Cryptograph = null;
}
return Cryptograph;
};
用户第一次在系统中输入自己的个人真实数据时,录入数据库的是AES加密后的数据,然而当用户使用注册后的账号登陆系统时,这部分操作为解密操作。AES是一种可逆的加密工具类,何为可逆?即既可以通过AES对信息进行加密,又可以运用AES对用户输入的信息进行解密。
第四步,AES解密方法:
public static Byte[] AESDecrypt(Byte[] Data, String Key, String Vector)
{
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
Byte[] bVector = new Byte[16];
Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
Byte[] original = null; // 解密后的明文
Rijndael Aes = Rijndael.Create();
try
{
// 开辟一块内存流,存储密文
using (MemoryStream Memory = new MemoryStream(Data))
{
// 把内存流对象包装成加密流对象
using (CryptoStream Decryptor = new CryptoStream(Memory,
Aes.CreateDecryptor(bKey, bVector),
CryptoStreamMode.Read))
{
// 明文存储区
using (MemoryStream originalMemory = new MemoryStream())
{
Byte[] Buffer = new Byte[1024];
Int32 readBytes = 0;
while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)
{
originalMemory.Write(Buffer, 0, readBytes);
}
original = originalMemory.ToArray();
}
}
}
}
catch
{
original = null;
}
return original;
};
当用户使用注册后的账号&密码进行登录时,将用户输入的信息提取出来,进行解密后扔去数据库与数据库中所存放的用户信息进行匹配,这便是解密的操作。
与其他的加密工具类一致,AES也是有着专属的加解密算法的,且算法的位数越高则越难以破解,这也是最后一步我们要做的:
在这里所用到的是AES中的256位加密算法,安全性较高,接下来是解密算法,与加密算法差不多: