C#.net实现密码加密算法

//SHA-1算法
string password = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, "SHA1");
//MD5算法
string password1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, "MD5");

加密后生成不可逆密文保存到数据库中。用户登录时用加密计算后的密文与数据库中的密码密文比较。一致则通过验证,不一致则返回登录错误。
这种加密算法是不可逆的,所以除了用户自己,其他人无法得知用户的真实密码内容。

SHA-1算法和MD5算法的区别:
SHA-1比MD5多32位密文,所以更安全。由于同样的原因,MD5比SHA-1的运算速度更快。




加密算法总汇
方法一:
    //须添加对System.Web的引用 
    using System.Web.Security; 
     
    ... 
     
    ///  
    /// SHA1加密字符串 
    ///
 

    /// 源字符串 
    /// 加密后的字符串 
    public string SHA1(string source) 
    { 
        return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1"); 
    } 
 
 
    ///  
    /// MD5加密字符串 
    ///
 

    /// 源字符串 
    /// 加密后的字符串 
    public string MD5(string source) 
    { 
        return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");; 
    }


方法二(可逆加密解密):
    using System.Security.Cryptography; 
     
    ... 
     
    public string Encode(string data) 
    { 
        byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); 
        byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); 
     
        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); 
        int i = cryptoProvider.KeySize; 
        MemoryStream ms = new MemoryStream(); 
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write); 
     
        StreamWriter sw = new StreamWriter(cst); 
        sw.Write(data); 
        sw.Flush(); 
        cst.FlushFinalBlock(); 
        sw.Flush(); 
        return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); 
     
    } 
     
    public string Decode(string data) 
    { 
        byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); 
        byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); 
     
        byte[] byEnc; 
        try
        { 
            byEnc = Convert.FromBase64String(data); 
        } 
        catch
        { 
            return null; 
        } 
     
        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); 
        MemoryStream ms = new MemoryStream(byEnc); 
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read); 
        StreamReader sr = new StreamReader(cst); 
        return sr.ReadToEnd(); 
    }

方法三(MD5不可逆):
    using System.Security.Cryptography; 
     
    ... 
     
    //MD5不可逆加密 
     
    //32位加密 
     
    public string GetMD5_32(string s, string _input_charset) 
    { 
        MD5 md5 = new MD5CryptoServiceProvider(); 
        byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); 
        StringBuilder sb = new StringBuilder(32); 
        for (int i = 0; i < t.Length; i++) 
        { 
            sb.Append(t[i].ToString("x").PadLeft(2, '0')); 
        } 
        return sb.ToString(); 
    } 
     
    //16位加密 
    public static string GetMd5_16(string ConvertString) 
    { 
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
        string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); 
        t2 = t2.Replace("-", ""); 
        return t2; 
    }

方法四(对称加密):
    using System.IO; 
    using System.Security.Cryptography; 
     
    ... 
     
    private SymmetricAlgorithm mobjCryptoService; 
    private string Key; 
    ///     
    /// 对称加密类的构造函数    
    ///
    

    public SymmetricMethod() 
    { 
        mobjCryptoService = new RijndaelManaged(); 
        Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7"; 
    } 
    ///     
    /// 获得密钥    
    ///
    

    /// 密钥    
    private byte[] GetLegalKey() 
    { 
        string sTemp = Key; 
        mobjCryptoService.GenerateKey(); 
        byte[] bytTemp = mobjCryptoService.Key; 
        int KeyLength = bytTemp.Length; 
        if (sTemp.Length > KeyLength) 
            sTemp = sTemp.Substring(0, KeyLength); 
        else if (sTemp.Length < KeyLength) 
            sTemp = sTemp.PadRight(KeyLength, ' '); 
        return ASCIIEncoding.ASCII.GetBytes(sTemp); 
    } 
    ///     
    /// 获得初始向量IV    
    ///
    

    /// 初试向量IV    
    private byte[] GetLegalIV() 
    { 
        string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; 
        mobjCryptoService.GenerateIV(); 
        byte[] bytTemp = mobjCryptoService.IV; 
        int IVLength = bytTemp.Length; 
        if (sTemp.Length > IVLength) 
            sTemp = sTemp.Substring(0, IVLength); 
        else if (sTemp.Length < IVLength) 
            sTemp = sTemp.PadRight(IVLength, ' '); 
        return ASCIIEncoding.ASCII.GetBytes(sTemp); 
    } 
    ///     
    /// 加密方法    
    ///
    

    /// 待加密的串    
    /// 经过加密的串    
    public string Encrypto(string Source) 
    { 
        byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); 
        MemoryStream ms = new MemoryStream(); 
        mobjCryptoService.Key = GetLegalKey(); 
        mobjCryptoService.IV = GetLegalIV(); 
        ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor(); 
        CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); 
        cs.Write(bytIn, 0, bytIn.Length); 
        cs.FlushFinalBlock(); 
        ms.Close(); 
        byte[] bytOut = ms.ToArray(); 
        return Convert.ToBase64String(bytOut); 
    } 
    ///     
    /// 解密方法    
    ///
    

    /// 待解密的串    
    /// 经过解密的串    
    public string Decrypto(string Source) 
    { 
        byte[] bytIn = Convert.FromBase64String(Source); 
        MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length); 
        mobjCryptoService.Key = GetLegalKey(); 
        mobjCryptoService.IV = GetLegalIV(); 
        ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor(); 
        CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); 
        StreamReader sr = new StreamReader(cs); 
        return sr.ReadToEnd(); 
    }

方法五:
    using System.IO; 
    using System.Security.Cryptography; 
    using System.Text; 
     
    ... 
     
    //默认密钥向量 
    private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 
    ///  
    /// DES加密字符串 
    ///
 

    /// 待加密的字符串 
    /// 加密密钥,要求为8位 
    /// 加密成功返回加密后的字符串,失败返回源串 
    public static string EncryptDES(string encryptString, string encryptKey) 
    { 
        try
        { 
            byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); 
            byte[] rgbIV = Keys; 
            byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); 
            DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); 
            MemoryStream mStream = new MemoryStream(); 
            CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 
            cStream.Write(inputByteArray, 0, inputByteArray.Length); 
            cStream.FlushFinalBlock(); 
            return Convert.ToBase64String(mStream.ToArray()); 
        } 
        catch
        { 
            return encryptString; 
        } 
    } 
     
    ///  
    /// DES解密字符串 
    ///
 

    /// 待解密的字符串 
    /// 解密密钥,要求为8位,和加密密钥相同 
    /// 解密成功返回解密后的字符串,失败返源串 
    public static string DecryptDES(string decryptString, string decryptKey) 
    { 
        try
        { 
            byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey); 
            byte[] rgbIV = Keys; 
            byte[] inputByteArray = Convert.FromBase64String(decryptString); 
            DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); 
            MemoryStream mStream = new MemoryStream(); 
            CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 
            cStream.Write(inputByteArray, 0, inputByteArray.Length); 
            cStream.FlushFinalBlock(); 
            return Encoding.UTF8.GetString(mStream.ToArray()); 
        } 
        catch
        { 
            return decryptString; 
        } 
    }

方法六(文件加密):
    using System.IO; 
    using System.Security.Cryptography; 
    using System.Text; 
     
    ... 
     
    //加密文件 
    private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV) 
    { 
        //Create the file streams to handle the input and output files. 
        FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read); 
        FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); 
        fout.SetLength(0); 
     
        //Create variables to help with read and write. 
        byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
        long rdlen = 0;              //This is the total number of bytes written. 
        long totlen = fin.Length;    //This is the total length of the input file. 
        int len;                     //This is the number of bytes to be written at a time. 
     
        DES des = new DESCryptoServiceProvider(); 
        CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write); 
     
        //Read from the input file, then encrypt and write to the output file. 
        while (rdlen < totlen) 
        { 
            len = fin.Read(bin, 0, 100); 
            encStream.Write(bin, 0, len); 
            rdlen = rdlen + len; 
        } 
     
        encStream.Close(); 
        fout.Close(); 
        fin.Close(); 
    } 
     
    //解密文件 
    private static void DecryptData(String inName, String outName, byte[] desKey, byte[] desIV) 
    { 
        //Create the file streams to handle the input and output files. 
        FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read); 
        FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); 
        fout.SetLength(0); 
     
        //Create variables to help with read and write. 
        byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
        long rdlen = 0;              //This is the total number of bytes written. 
        long totlen = fin.Length;    //This is the total length of the input file. 
        int len;                     //This is the number of bytes to be written at a time. 
     
        DES des = new DESCryptoServiceProvider(); 
        CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write); 
     
        //Read from the input file, then encrypt and write to the output file. 
        while (rdlen < totlen) 
        { 
            len = fin.Read(bin, 0, 100); 
            encStream.Write(bin, 0, len); 
            rdlen = rdlen + len; 
        } 
     
        encStream.Close(); 
        fout.Close(); 
        fin.Close(); 
 
}

using System;
using System.Security.Cryptography;//这个是处理文字编码的前提
using System.Text;
using System.IO;
///
/// DES加密方法
///

/// 明文
/// 密钥
/// 向量
/// 密文
public string DESEncrypt(string strPlain,string strDESKey,string strDESIV)
{
 //把密钥转换成字节数组
 byte[] bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey);
 //把向量转换成字节数组
 byte[] bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV);
 //声明1个新的DES对象
 DESCryptoServiceProvider desEncrypt=new DESCryptoServiceProvider();
 //开辟一块内存流
 MemoryStream msEncrypt=new MemoryStream();
 //把内存流对象包装成加密流对象
 CryptoStream csEncrypt=new CryptoStream(msEncrypt,desEncrypt.CreateEncryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Write);
 //把加密流对象包装成写入流对象
 StreamWriter swEncrypt=new StreamWriter(csEncrypt);
 //写入流对象写入明文
 swEncrypt.WriteLine(strPlain);
 //写入流关闭
 swEncrypt.Close();
 //加密流关闭
 csEncrypt.Close();
 //把内存流转换成字节数组,内存流现在已经是密文了
 byte[] bytesCipher=msEncrypt.ToArray();
 //内存流关闭
 msEncrypt.Close();
 //把密文字节数组转换为字符串,并返回
 return UnicodeEncoding.Unicode.GetString(bytesCipher);
}
 
 
 
 
///
/// DES解密方法
///

/// 密文
/// 密钥
/// 向量
/// 明文
public string DESDecrypt(string strCipher,string strDESKey,string strDESIV)
{
 //把密钥转换成字节数组
 byte[] bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey);
 //把向量转换成字节数组
 byte[] bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV);
 //把密文转换成字节数组
 byte[] bytesCipher=UnicodeEncoding.Unicode.GetBytes(strCipher);
 //声明1个新的DES对象
 DESCryptoServiceProvider desDecrypt=new DESCryptoServiceProvider();
 //开辟一块内存流,并存放密文字节数组
 MemoryStream msDecrypt=new MemoryStream(bytesCipher);
 //把内存流对象包装成解密流对象
 CryptoStream csDecrypt=new CryptoStream(msDecrypt,desDecrypt.CreateDecryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Read);
 //把解密流对象包装成读出流对象
 StreamReader srDecrypt=new StreamReader(csDecrypt);
 //明文=读出流的读出内容
 string strPlainText=srDecrypt.ReadLine();
 //读出流关闭
 srDecrypt.Close();
 //解密流关闭
 csDecrypt.Close();
 //内存流关闭
 msDecrypt.Close();
 //返回明文
 return strPlainText;
}

转自:http://blog.163.com/wenchangqing_live/blog/static/173722309201211288225320/

http://www.cnblogs.com/zengxiangzhan/archive/2010/01/30/1659687.html


一:加强页面间传值的安全性

  二:Convert.ToBase64String

  三:运行效果

  一:加强页面间传值的安全性

  使用查询字符串进行页面间传值的过程中,一定要把查询字符串要传递的值进行加密,以下是未对查询字符串加密的URL:http://localhost:3337/ProductView.aspx?ID=12,用户可以修改查询字符串的值,例如:将ID=12改为ID=16,ID=16本是VIP才能访问的产品页面,这样的话,就可以做到访问没有权限的页面,所以要想保证查询字符串的安全,可以使用加密算法,解密算法,对查询字符串中要传递的值进行加密,例如加密后的效果:http://localhost:3337/ProductView.aspx?ID=Z9j8pUm

  这种方法不是很安全,当别人知道你是通过Convert.ToBase64String这种方法加密查询字符串的话,别人同样可以用Convert.FromBase64String这个方法来解密你加密后的查询字符串

  二:Convert.ToBase64String

  ParameterEncryptDecrypt.aspx

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Configuration;
  using System.Web.Configuration;
  using EPG.CommonClass;
  using System.IO;
  using System.Text;

  namespace EPG.WebAdmin.EncryptDecrypt
  {
      public partial class ParameterEncryptDecrypt : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              string strParameter = Request.QueryString["ID"].ToString();//查询字符串
              //Convert.ToBase64String的参数需要一个字节数组,所以我们先要把查询字符串转化为字节数组
              byte[] bytes = Encoding.Default.GetBytes(strParameter);
              string strEncryptParameter = Convert.ToBase64String(bytes);//加密后的参数
              Response.Write("
加密后的值为:" + strEncryptParameter);
          }

          ///


          /// 解密参数
          ///

          ///
          ///
          protected void btnParameter_Click(object sender, EventArgs e)
          {
              string strParameter = Request.QueryString["ID"].ToString();
              byte[] bytes = Encoding.Default.GetBytes(strParameter);
              string strEncryptParameter = Convert.ToBase64String(bytes);//加密后的参数
              byte[] bytes2 = Convert.FromBase64String(strEncryptParameter);
              string strDecryptParameter = Encoding.Default.GetString(bytes2);//解密后的参数
              Response.Write("
解密后的值为:"+ strDecryptParameter);
          }
      }
  }

  三:运行效果

  C#.net实现密码加密算法_第1张图片

  C#.net实现密码加密算法_第2张图片

  C#.net实现密码加密算法_第3张图片

  C#.net实现密码加密算法_第4张图片

 

转自:http://www.cnblogs.com/menglin2010/archive/2012/02/26/2364712.html

你可能感兴趣的:(C#)