MD5加密

在需要密码存入数据库时往往需要加密,这样在数据库发生意外时可以不被获取,保证用户账号安全。
这里使用的是MD5加密方法

  1. public static string GetMD5(string str)
  2. {
  3. //创建MD5对象
  4. MD5 md5 = MD5.Create();
  5. //开始加密
  6. //首先将字符串转换成字符数组
  7. byte[] buffer = Encoding.Default.GetBytes(str);
  8. //开始加密,并返回
  9. byte[] md5_buffer = md5.ComputerHash(buffer);
  10. }

这里我们要的应该是字符串,而我们要的是一个字符串,这里就要提到字符串转换的方法 字节数组转换成字符串 1.用编码的方式

  1. string x = Encoding.UTF8.GetString(bytes []);

这种方法使的原理是将字节数组以二进制编码的方式将字节数组转换成字符串

2.用ToString的方式,这里又要引出ToString的特殊用法ToString(“x2”) x:是将字节以16进制进行转换,2:代表格式化,不舍0 如01不舍弃前面的0.

  1. 1.将字节数组toString
  2. string x1 = md5_buffer.ToString();
  3. 2.将字节数组的每一个元素ToString
  4. string s = "";
  5. for (int i = 0; i < md5Bytes.Length; i++)
  6. {
  7. s += md5Bytes[i].ToString("x2");
  8. }

DES加密

des加密:对称可逆加密(解密与解密的钥匙是一个)

  1. class DesEncrypt
  2. {
  3. public static string _KEY = "HQDCKEY1"; //密钥
  4. public static string _IV = "HQDCKEY2"; //向量
  5. /// <summary>
  6. /// 加密
  7. /// </summary>
  8. /// <param name="data">待加密文本</param>
  9. /// <returns>加密后的文本</returns>
  10. public static string Encrypt(string data)
  11. {
  12. byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);
  13. byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);
  14. DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  15. int i = cryptoProvider.KeySize;
  16. MemoryStream ms = new MemoryStream();
  17. CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
  18. StreamWriter sw = new StreamWriter(cst);
  19. sw.Write(data);
  20. sw.Flush();
  21. cst.FlushFinalBlock();
  22. sw.Flush();
  23. string strRet = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
  24. return strRet;
  25. }
  26. /// <summary>
  27. /// SES解密
  28. /// </summary>
  29. /// <param name="data">待解密字符</param>
  30. /// <returns>解密后的文本</returns>
  31. public static string Decode(string data)
  32. {
  33. byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);
  34. byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);
  35. byte[] byEnc;
  36. try
  37. {
  38. data.Replace("_%_", "/");
  39. data.Replace("-%-", "#");
  40. byEnc = Convert.FromBase64String(data);
  41. }
  42. catch
  43. {
  44. return null;
  45. }
  46. DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  47. MemoryStream ms = new MemoryStream(byEnc);
  48. CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
  49. StreamReader sr = new StreamReader(cst);
  50. return sr.ReadToEnd();
  51. }
  52. }

RAS加密

非对称可逆加密

加密钥与解密钥不能反过来用。

将加密钥为私钥,解密钥为公钥,可以保证发布信息的真实性
可以理解为数字签名。作用就是验证信息的真实性、验证身份。

将解密钥为私钥,加密钥为公钥,可以保证信息的私密性,保证信息
这有我可以看到。就像抗战片的加密电报信息。

  1. class RasEncrypt
  2. {
  3. /// <summary>
  4. /// 获取加密/解密对
  5. /// </summary>
  6. /// <returns></returns>
  7. public static KeyValuePair<string, string> GetKeyValuePair()
  8. {
  9. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
  10. string publicKey = RSA.ToXmlString(false);
  11. string privateKey = RSA.ToXmlString(true);
  12. return new KeyValuePair<string, string>(publicKey, privateKey);
  13. }
  14. /// <summary>
  15. /// Ras加密
  16. /// </summary>
  17. /// <param name="content">加密内容</param>
  18. /// <param name="encryptKey">加密Key</param>
  19. /// <returns>加密后的文本</returns>
  20. public static string Encrypt(string content,string encryptKey)
  21. {
  22. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  23. rsa.FromXmlString(encryptKey);
  24. UnicodeEncoding ByteConverter = new UnicodeEncoding();
  25. byte[] DataToEncrypt = ByteConverter.GetBytes(content);
  26. byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
  27. return Convert.ToBase64String(resultBytes);
  28. }
  29. public static string Decrypt(string content,string decryptKey)
  30. {
  31. byte[] dataToDecrypt = Convert.FromBase64String(content);
  32. RSACryptoServiceProvider rSA = new RSACryptoServiceProvider();
  33. rSA.FromXmlString(decryptKey);
  34. byte[] resultBytes = rSA.Decrypt(dataToDecrypt, false);
  35. UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
  36. return unicodeEncoding.GetString(resultBytes);
  37. }
  38. }

Https的证书机制

主要是为了防止域名的劫持(DNS劫持),你请求响应可能不是你想请求的网站响应,域名可能转发到了另一台服务器上,作出的响应。为了防止这种现象,所以使用Https这种机制,来完成验证,具体的验证逻辑是IIs服务器的操作,你只需要简单的配置,而不需要改动原本的业务逻辑,就能实现这种Https的安全认证标准。

04_C#之加密 - 图1

Https就是用这种机制,实现安全的认证方式:单边认证

04_C#之加密 - 图2

当然还有双边认证,也就是银行所使用的U盾。原理就是浏览器不内置第三方认证机构,需要自己去相信一个认证,然后用这个相信的去鉴别服务器来达到双边认证的效果。