本人真心菜鸟一枚,还在实习,属于那种大学纯玩过来的(现在想想挺后悔的= =),学校教的东西不是很多,但我能记住还能自己弄弄的也就只有WinForm了。
开始实习以后感觉进状态了,每天都在接任务、敲代码、各种百度各种看书各种跟前辈请教中度过,知识在进步的感觉真心很爽,敲代码的兴趣也大大增加了。
---------------------------------------------------------------割----------------------------------------------------------------------
之前一阵公司不忙所以就暂时闲了下来,就想着接着弄弄WinForm吧,主要是因为就这个还熟一点啊。之前就一直觉得现在好多地方都需要注册,用户名密码什么的真心太多了,全弄成一样的吧,总怕不太安全,弄成不一样的吧真心太多了,记在纸上又怕弄丢。于是乎就想着弄一个存账户密码的东西(虽然后来也写了别的功能),但这东西始终是有安全问题的啊,最后决定用到DES加密来完成存储。一条存储记录包括位置(就是哪个论坛或者哪个网站)、用户名和密码,本来想着存到数据库里一想不对,不可能谁都往自己电脑里装个数据库啊。但是本人还没熟悉XML.....所以就选择了存到txt文件中。
个人觉的这种方法的好处在于以前你需要记很多的账号和密码,而现在你只需要记住一条8位密钥就足够了。(不过这个都忘了的话就真没辙了......)
存储部分
存储的逻辑就是在存储界面输入位置、用户名和密码以后还需设定一个8位字母数字组成的密钥,再点击存储后位置和用户名直接存进txt文件,而密码会用密钥和后台加密规则加密后再存进txt文件,以此来完成一条记录的存储。而填写的密钥也会被后台规则加密后存在另一个txt文件中以备提取时使用。
提取部分
提取的逻辑就是在提取界面有一下拉框,里面有所有的位置信息,当选择其中一条后点击提取按钮会显示出用户名和加密后的密码,然后再输入之前的密钥进行解密,就可以得到自己的用户名和密码了。
---------------------------------------------------------------再割----------------------------------------------------------------------
接下来给大家展示一下使用过程:
先是在存储界面将所有信息填写好然后点击存入,如果是第一次存储,系统会将密钥存入txt文件并设为默认密钥,之后再存储的话就不需要再进行输入了。存储成功后会在目标文件中以[位置*用户名&密码]将信息存入,存储成功后位置用户密码文本信息为:TestLocation*TestName&zbvVfu5PR4o=。
然后是提取刚刚存入的这条记录,在提取界面下拉框选择刚刚的位置选择好后点击提取按钮,得到用户名与加密后的密码然后再将正确的密钥进行输入并完成解密就可以得到正确的密码了到这儿就是功能的全部了。
因为也写了别的东西,代码就不全贴了,以下会把关键部分的代码贴出来:
#region 存储按钮 private void btn_Encrypt_Click(object sender, EventArgs e) { if (txt_SaveName.Text == "" || txt_SavePassword.Text == "" || txt_SaveLocation.Text == "") { MessageBox.Show("请将基本存储信息填写完整"); } else { if (txt_SaveKey.Text == "") { if (lbl_OldKey.Text == "") { MessageBox.Show("请填写加密秘钥"); } else { MessageBox.Show("系统将使用默认秘钥"); Save(txt_SaveLocation.Text, txt_SaveName.Text, Encrypting(txt_SavePassword.Text.Trim(), lbl_OldKey.Text.Trim())); } } else { if (lbl_OldKey.Text == "") { DialogResult dr = MessageBox.Show("是否确定使用此秘钥,执行后系统将设置为默认", "秘钥设置", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) { ChangeKeyPassword = Encrypting(txt_SaveKey.Text.Trim(), InitialKey); //将默认秘钥存入文件 FileStream fs = new FileStream(@".\Key.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(ChangeKeyPassword); sw.Close(); fs.Close(); lbl_OldKey.Text = txt_SaveKey.Text.Trim(); Save(txt_SaveLocation.Text, txt_SaveName.Text, Encrypting(txt_SavePassword.Text.Trim(), txt_SaveKey.Text.Trim())); } else { MessageBox.Show("请重新设置密钥"); } } else { MessageBox.Show("已存在默认秘钥,无法进行替换"); } } } } #endregion #region 加密过程 public string Encrypting(string entryptString, string key) { byte[] rgbKey = Encoding.UTF8.GetBytes(key); byte[] rgbIV = keys; byte[] inputByteArray = Encoding.UTF8.GetBytes(entryptString); 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()); } #endregion #region 解密过程 public string Deciphering(string decipherString, string key) { byte[] rgbKey = Encoding.UTF8.GetBytes(key); byte[] rgbIV = keys; byte[] inputByteArray = Convert.FromBase64String(decipherString); 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()); } #endregion #region 读取账号位置 public void ReadData() { int lineLength = lineIndex(@".\UserPassword.txt"); FileStream fs = new FileStream(@".\UserPassword.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); string LineContent; for (int line = 0; line < lineLength; line++) { if ((LineContent = sr.ReadLine()) != null) { int number = LineContent.IndexOf("*"); string item = LineContent.Substring(0, number); cbo_GetPosition.Items.Add(item); } else { cbo_GetPosition.Items.Clear(); } } sr.Close(); fs.Close(); } #endregion #region 解密按钮 private void btn_decipher_Click(object sender, EventArgs e) { if (txt_GetPassword.Text == "") { MessageBox.Show("请先查询出密码,再进行解密"); } else { if (txt_GetKey.Text == "") { MessageBox.Show("请填入解密秘钥"); } else { if (lbl_OldKey.Text == "") { MessageBox.Show("还未设置默认密钥"); } else { if (lbl_OldKey.Text == txt_GetKey.Text) { getpassword = Deciphering(txt_GetPassword.Text, lbl_OldKey.Text); txt_GetPassword.Text = getpassword; MessageBox.Show("解密完成"); btn_decipher.Enabled = false; } else { MessageBox.Show("密钥错误"); } } } } } #endregion
我也知道这个功能可能也就是大学实训课作业的等级,求别损.......,之所以写出来跟大家分享,一是自己写出来自己想写的东西满足感爆棚(嘿嘿),二是想让高手们看看是不是有哪儿可以改进,逻辑上是不是有问题,或者这种方式是不是不太安全,希望大神们能不吝赐教啊,感激不尽!