using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
using System.Security.Cryptography;
|
using System.Text;
|
using System.Web;
|
|
namespace FineUIPro.iWareWms.Util
|
{
|
public class PasswordUtil
|
{
|
#region field & constructor
|
|
//private static readonly Log _log = new Log(typeof(PasswordUtil));
|
|
private const int saltLength = 4;
|
|
public PasswordUtil() { }
|
|
#endregion
|
|
|
|
|
/// <summary>
|
/// 加密
|
/// </summary>
|
/// <param name="pwd"></param>
|
/// <returns></returns>
|
|
public static string PassWord_StringEncoding(string pwd)//加密
|
{
|
return EncryptDES(pwd, "0c6b0450");
|
}
|
/// <summary>
|
/// 解密
|
/// </summary>
|
/// <param name="pwd"></param>
|
/// <returns></returns>
|
public static string PassWord_StringDecoding(string pwd)//加密
|
{
|
return DecryptDES(pwd, "0c6b0450");
|
}
|
|
|
|
|
|
/// <summary>
|
/// 对比用户明文密码是否和加密后密码一致
|
/// </summary>
|
/// <param name="dbPassword">数据库中单向加密后的密码</param>
|
/// <param name="userPassword">用户明文密码</param>
|
/// <returns></returns>
|
public static bool ComparePasswords(string dbPassword, string userPassword)
|
{
|
if (string.IsNullOrEmpty(dbPassword) || string.IsNullOrEmpty(userPassword))
|
return false;
|
if (dbPassword.Equals(EncryptDES(userPassword, "0c6b0450")))
|
return true;
|
else
|
return false;
|
}
|
/// <summary>
|
/// DES加密字符串
|
/// </summary>
|
/// <param name="encryptString">待加密的字符串</param>
|
/// <param name="encryptKey">加密密钥,要求为8位</param>
|
/// <returns>加密成功返回加密后的字符串,失败返回源串 </returns>
|
public static string EncryptDES(string encryptString, string encryptKey)
|
{
|
byte[] Keys = { 0x22, 0x44, 0x86, 0xA8, 0x9A, 0xAF, 0xCD, 0x4F };
|
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;
|
}
|
}
|
|
/// <summary>
|
/// DES解密字符串
|
/// </summary>
|
/// <param name="decryptString">待解密的字符串</param>
|
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
|
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
|
public static string DecryptDES(string decryptString, string decryptKey)
|
{
|
|
byte[] Keys = { 0x22, 0x44, 0x86, 0xA8, 0x9A, 0xAF, 0xCD, 0x4F };
|
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;
|
}
|
}
|
/// <summary>
|
/// 创建用户的数据库密码
|
/// </summary>
|
/// <param name="password"></param>
|
/// <returns></returns>
|
public static string CreateDbPassword(string userPassword)
|
{
|
//return PassWordHelp.StringEncoding(userPassword);
|
return PassWord_StringEncoding(userPassword);
|
|
|
|
}
|
|
#region 私有函数
|
/// <summary>
|
/// 将一个字符串哈希化
|
/// </summary>
|
/// <param name="str"></param>
|
/// <returns></returns>
|
private static byte[] HashString(string str)
|
{
|
byte[] pwd = System.Text.Encoding.UTF8.GetBytes(str);
|
|
SHA1 sha1 = SHA1.Create();
|
byte[] saltedPassword = sha1.ComputeHash(pwd);
|
return saltedPassword;
|
}
|
private static bool CompareByteArray(byte[] array1, byte[] 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;
|
}
|
// create a salted password given the salt value
|
private static byte[] CreateSaltedPassword(byte[] saltValue, byte[] unsaltedPassword)
|
{
|
// add the salt to the hash
|
byte[] rawSalted = new byte[unsaltedPassword.Length + saltValue.Length];
|
unsaltedPassword.CopyTo(rawSalted, 0);
|
saltValue.CopyTo(rawSalted, unsaltedPassword.Length);
|
|
//Create the salted hash
|
SHA1 sha1 = SHA1.Create();
|
byte[] saltedPassword = sha1.ComputeHash(rawSalted);
|
|
// add the salt value to the salted hash
|
byte[] dbPassword = new byte[saltedPassword.Length + saltValue.Length];
|
saltedPassword.CopyTo(dbPassword, 0);
|
saltValue.CopyTo(dbPassword, saltedPassword.Length);
|
|
return dbPassword;
|
}
|
#endregion
|
}
|
}
|