?? securityhelper.cs
字號:
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace Stella.Utility
{
/// <summary>
/// 執行安全操作的輔助類
/// </summary>
/// <remarks>
/// 數據庫連接字符串的操作來自pethshop3
/// </remarks>
public abstract class SecurityHelper
{
private SecurityHelper(){}
#region 數據庫連接字符串的操作
/// <summary>
/// 解密數據庫連接字符串
/// </summary>
/// <param name="InputConnectionString">加密后的數據庫連接字符串</param>
/// <returns>解密后的數據庫連接字符串</returns>
/// <remarks>
/// 來自pethsop3
/// </remarks>
public static string DecryptDBConnectionString(string InputConnectionString)
{
// If the variable is blank, return the input
if(InputConnectionString.Equals(string.Empty))
{
return InputConnectionString;
}
// Create an instance of the encryption API
// We assume the key has been encrypted on this machine and not by a user
DataProtector dp = new DataProtector(Store.Machine);
// Use the API to decrypt the connection string
// API works with bytes so we need to convert to and from byte arrays
byte[] decryptedData = dp.Decrypt( Convert.FromBase64String( InputConnectionString ), null );
// Return the decyrpted data to the string
return Encoding.ASCII.GetString( decryptedData );
}
/// <summary>
/// 加密數據庫連接字符串
/// </summary>
/// <param name="encryptedString">未加密的數據庫連接字符串</param>
/// <returns>加密后數據庫連接字符串</returns>
/// <remarks>
/// 來自pethsop3
/// </remarks>
public static string EncryptDBConnectionString(string encryptedString)
{
// Create an instance of the encryption API
// We assume the key has been encrypted on this machine and not by a user
DataProtector dp = new DataProtector(Store.Machine);
// Use the API to encrypt the connection string
// API works with bytes so we need to convert to and from byte arrays
byte[] dataBytes = Encoding.ASCII.GetBytes( encryptedString );
byte[] encryptedBytes = dp.Encrypt( dataBytes, null );
// Return the encyrpted data to the string
return Convert.ToBase64String( encryptedBytes );
}
#endregion
#region 加密用戶輸入的密碼
private static int saltLen=ConfigHelper.SaltLength;
/// <summary>
/// 加密用戶輸入的密碼
/// </summary>
/// <param name="input">用戶輸入的密碼</param>
/// <returns>加密后的密碼</returns>
public static byte[] EncryptPassword(string input)
{
byte[] sha1Pwd;
SHA1 sha1=SHA1.Create();
sha1Pwd=sha1.ComputeHash(Encoding.Unicode.GetBytes(input));
sha1.Clear();
//創造鹽值
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
byte[] salt=new byte[saltLen];
rng.GetBytes(salt);
return saltedDBPassword(sha1Pwd,salt);
}
/// <summary>
/// 加密用戶輸入的密碼
/// </summary>
/// <param name="input">用戶輸入的密碼</param>
/// <param name="salt">鹽值</param>
/// <returns>加密后的密碼</returns>
public static byte[] EncryptPassword(string input,byte[] salt)
{
byte[] sha1Pwd;
SHA1 sha1=SHA1.Create();
sha1Pwd=sha1.ComputeHash(Encoding.Unicode.GetBytes(input));
sha1.Clear();
return saltedDBPassword(sha1Pwd,salt);
}
private static byte[] saltedDBPassword(byte[] sha1Pwd,byte[] salt)
{
System.Diagnostics.Debug.Fail(Convert.ToBase64String(salt));
//將密碼和鹽值聯合在一起
int len=sha1Pwd.Length;
byte[] plusPwd=new byte[len+saltLen];
sha1Pwd.CopyTo(plusPwd,0);
salt.CopyTo(plusPwd,len);
//加密加入鹽值的密碼
SHA1 sha1=SHA1.Create();
byte[] saltedPwd=sha1.ComputeHash(plusPwd);
sha1.Clear();
//將鹽值和密碼一起存儲到數據庫
int len2=saltedPwd.Length;
byte[] DBPwd=new byte[len2+saltLen];
saltedPwd.CopyTo(DBPwd,0);
salt.CopyTo(DBPwd,len2);
return DBPwd;
}
#endregion
#region 隨機密碼生成
/// <summary>
/// 隨機密碼生成
/// </summary>
/// <param name="pwdchars">生成的隨機密碼串可以使用哪些字符</param>
/// <param name="pwdlen">生成的隨機密碼串的長度</param>
/// <returns>隨機明文密碼</returns>
public static string MakeLightPassword(string pwdchars, int pwdlen)
{
//通過調用 Random 類的 Next() 方法
//先獲得一個大于或等于 0 而小于 pwdchars 長度的整數
//以該數作為索引值,從可用字符串中隨機取字符
//以指定的密碼長度為循環次數,依次連接取得的字符
//最后即得到所需的隨機密碼串了。
StringBuilder tmpstr =new StringBuilder();
int iRandNum;
Random rnd = new Random();
for(int i=0;i<pwdlen;i++)
{
iRandNum = rnd.Next(pwdchars.Length);
//tmpstr += pwdchars[iRandNum];
tmpstr.Append(pwdchars[iRandNum]);
}
return tmpstr.ToString();
}
#endregion
/// <summary>
/// 比較兩個字節數組
/// </summary>
/// <param name="array1">數組1</param>
/// <param name="array2">數組2</param>
/// <returns>是否相等</returns>
public static bool CompareByteArray(byte[] array1, byte[] array2)
{
System.Diagnostics.Debug.Fail(Convert.ToBase64String(array1),Convert.ToBase64String(array2));
if (array1.Length != array2.Length)
return false;
for (int i = 0; i < array1.Length; i++)
{
if (array1[i] != array2[i])
return false;
}
return true;
}
/// <summary>
/// 從加密的字節數組中得到鹽值
/// </summary>
/// <param name="DBPassword">加密的字節數組</param>
/// <returns>鹽值</returns>
public static byte[] GetSalt(byte[] DBPassword)
{
int len=ConfigHelper.SaltLength;
int len2=DBPassword.Length-len;
byte[] salt=new byte[len];
for(int i=0;i<len;i++)
{
salt[i]=DBPassword[len2+i];
}
return salt;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -