账号密码管理器(MD5+DES+XML)

不知道大伙现在有没有感觉账号密码越来越多了啊?

QQ,MSN,博客园,淘宝,网银,银行卡 . . . . . 我靠,也太多了吧,

总不可能全部设置为一样的吧,为了解决这个难记的问题,所以今天做了个账号密码管理器。

账号密码器呢当然就是用来管理您所有的账号和密码的。

先来看开发环境吧:

开发环境是 Visual Studio 2010 (. net framework 4.0)

操作系统是 Windows 7

由于有些内容使用到了 .net 4.0 的内容,所以必须在 .net 4.0 环境下使用,

可以通过以下下载到 .net framework 4.0

http://www.microsoft.com/downloads/zh-cn/confirmation.aspx?familyId=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displayLang=zh-cn

本来呢,是打算将加密后的字符串放到数据库中的,但是考虑到哪有那么多人机器上装个数据库怪物啊,

所以便舍弃了使用数据库,取而代之的是 XML 文件来完成。

然后加密的话,由于用户要登录进去才能查看自己的密码和账号等信息,所以使用到了 MD5 加密,

加密的原理呢就是当用户注册时,我便通过 MD5 获取用户的用户名对应的 Hash 值,并将这个 Hash 值保存在 XML 中,

然后在用户登录时,我还是获取用户输入的用户名的 Hash 值,然后我拿这个 Hash 值和保存在 XML 中的 Hash 值比较,

如果一致则可以登录,否则拒绝登录。

用户登录进去以后呢,便可以对自己的一些诸如 QQ ,MSN 等账号信息进行添加保存了,

但是由于这些信息也都是存在 XML 中,所以别个都可以看见,很明显,这也需要加密,

同时,用户以后还要查看密码和账号,所以很明显还需要解密,

由于 MD5 加密后很难解密回来,所以放弃了 MD5 而转为使用 DES 加密,

将用户的账户信息使用 DES 加密后存储在 XML 文件中,

在需要使用这些数据的时候便解密调用就 OK 了,

贴出一点点代码:

下面是使用 MD5 获取字符串的 Hash 字符串:

        #region 返回明文的 Hash 字符串
public static string GetEncryptHash(string str)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(str));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
#endregion

下面是 DES 加密的代码:

        #region DES加密
public static string DesEncrypt(string encryptString, string key)
{
//获取 Key
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] keyIV = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream =
new CryptoStream(mStream,
provider.CreateEncryptor(keyBytes, keyIV),
CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
#endregion

添加一条用户账户记录代码示例:

        #region 添加一条记录
/// <summary>
/// 必须提供记录的管理者,记录的名称,记录下来的用户名
/// 记录下来的密码
/// 以及加密键值
/// </summary>
/// <param name="username"></param>
/// <param name="accountName"></param>
/// <param name="accountusername"></param>
/// <param name="accountpassword"></param>
/// <param name="key"></param>
public void AddAccount(string username, string accountName,
string accountusername, string accountpassword, string key)
{
InitAccount();
XmlElement dataNode = xmlDoc.CreateElement("data");
//该条记录的所有者
XmlElement usernameNode = xmlDoc.CreateElement("username");
XmlElement accountNode = xmlDoc.CreateElement("account");
//该条记录的类型或者说是名称
XmlElement accountnameNode = xmlDoc.CreateElement("accountname");
//该条记录所要保存的用户名
XmlElement accountusernameNode =
xmlDoc.CreateElement("accountusername");
//该条记录所要保存的密码
XmlElement accountpasswordNode =
xmlDoc.CreateElement("accountpassword");

//管理员用户名必须为 MD5 加密过的才能放进来
usernameNode.InnerText = username;
//对账户名称以及账户名和密码均进行 DES 加密
accountnameNode.InnerText =
Encrypt.DesEncrypt(accountName, key);
accountusernameNode.InnerText =
Encrypt.DesEncrypt(accountusername, key);
accountpasswordNode.InnerText =
Encrypt.DesEncrypt(accountpassword, key);

xmlRoot.AppendChild(dataNode);
dataNode.AppendChild(usernameNode);
dataNode.AppendChild(accountNode);
accountNode.AppendChild(accountnameNode);
accountNode.AppendChild(accountusernameNode);
accountNode.AppendChild(accountpasswordNode);

xmlDoc.Save(xmlPath);
}
#endregion

得到当前登陆用户的所有的账户信息,但是还没有解密:

        #region 得到当前登陆用户的所有的账户信息,但是还没有解密
public DataTable GetAllAccount(string username)
{
DataTable dataTable = new DataTable();
DataRow dataRow;
dataTable.Columns.Add("AccountName", Type.GetType("System.String"));
dataTable.Columns.Add("UserName", Type.GetType("System.String"));
dataTable.Columns.Add("Password", Type.GetType("System.String"));
InitAccount();
string nameHash = Encrypt.GetEncryptHash(username);
for (int i = 0; i < xmlRoot.ChildNodes.Count; i++)
{
if (nameHash ==
xmlRoot.ChildNodes[i].FirstChild.InnerText.ToString())
{
dataRow = dataTable.NewRow();
//获取记录名称
dataRow[0] = xmlRoot.ChildNodes[i].LastChild.FirstChild.
InnerText.ToString();
//获取用户名
dataRow[1] = xmlRoot.ChildNodes[i].LastChild.FirstChild.
NextSibling.InnerText.ToString();
//获取密码
dataRow[2] = xmlRoot.ChildNodes[i].LastChild.LastChild.
InnerText.ToString();
dataTable.Rows.Add(dataRow);
}
}
return dataTable;
}
#endregion

 

也截几张图出来吧:

(用户注册)

image

(用户登录)

image

(添加账户信息)

image

(查询账户信息)

image

上面很多内容都是比较简单,有需要源码的留邮箱吧!


 


 


 

posted @ 2010-06-25 23:33  小宝马的爸爸  阅读(7529)  评论(94编辑  收藏