基于WinForm制作的用户名密码存储器

本人真心菜鸟一枚,还在实习,属于那种大学纯玩过来的(现在想想挺后悔的= =),学校教的东西不是很多,但我能记住还能自己弄弄的也就只有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

  

我也知道这个功能可能也就是大学实训课作业的等级,求别损.......,之所以写出来跟大家分享,一是自己写出来自己想写的东西满足感爆棚(嘿嘿),二是想让高手们看看是不是有哪儿可以改进,逻辑上是不是有问题,或者这种方式是不是不太安全,希望大神们能不吝赐教啊,感激不尽!

时间: 2024-10-13 23:00:24

基于WinForm制作的用户名密码存储器的相关文章

Centos6.4下快速构建基于用户名密码验证的openvpn服务器

如今VPN应用已经非常广泛了,之前就写过一篇关于PPTPD的博文.链接是http://cyr520.blog.51cto.com/714067/1161788. 家里最近新换了一个宽带.居然没办法用拨上公司的PptpdVPN,一直拨号状态一直停留在正在验证用户名和密码这一步.百度谷歌了一大圈,也没解决这个问题.貌似是因为宽带运营商屏蔽GRE协议的原因.作为运维人员,不能及时的连上公司的内部网络是一件很让人不爽的事情. 干脆再搞一套OpenVPN吧,据说OpenVPN非常强大,可以适应很复杂的网络

OpenVPN2.4.3 基于用户名密码验证方式(实战)

安装部署参考"Open'VPN安装部署文档" 基于用户名密码验证: 1.修改server.conf: tls-auth ta.key 0 # This file is secret auth-user-pass-verify /usr/local/openvpn/config/checkpsw.sh via-env client-cert-not-required username-as-common-name script-security 3 注:如果加上client-cert-n

基于Express实现Passport用户名和密码登陆认证

Passport项目是一个基于Nodejs的认证中间件. Passport可以根据应用程序的特点,配置不同的认证机制.本文将介绍,用户名和密码的认证登陆. 1.express项目安装这里就不多说了,可以去express中文网拉下项目: http://www.expressjs.com.cn/ 2.安装依赖; npm install passport npm install passport-local passport-local 使用用户名和密码进行本地身份验证.通过插入Passport,本地

solr基于jetty容器配置后台登陆角色用户名密码

solr版本4.0.0 我的solr下载后解压在d盘,你的随意. 在D:\apache-solr-4.0.0\apache-solr-4.0.0\example\etc目录下新建role.properties文件,名字可随便. 内容如下: # # 这个文件定义用户名,密码和角色 # # 格式如下 # <username>: <password>[,<rolename> ...] # #userName: password,role test: 123,admin 编辑D

【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署

篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库完成一个法律咨询管理系统.本系统要求类似网页后台管理效果,并且基于局域网内,完成多客户端操作同一数据库,根据权限不同分别执行不同功能模块.核心模块为级联统计类型管理.数据库咨询数据扇形统计.树的操作.咨询数据的管理.手写分页.Excel数据的导出.多用户操作服务器数据等.并支持多用户同时操作,远程连

安装openvpn并使用证书+用户名密码登录

openvpn是一个vpn工具,用于创建虚拟专用网络(Virtual Private Network)加密通道的免费开源软件,提供证书验证功能,也支持用户名密码认证登录方式,当然也支持两者合一,为服务器登录和连接提供更加安全的方式,可以在不同网络访问场所之间搭建类似于局域网的专用网络通道,配合特定的代理服务器,可用于访问特定受限网站(你懂得)或者突破内部网络限制. 安装 模拟运行环境:centos6系列系统 # 关闭selinux setenforce 0 sed -i '/^SELINUX=/

在moss 服务器上访问自己的sharepoint 网站,输入用户名密码无效

环境:sharepoint 2007 ,windows server 2003 x64 sp2 该服务器部署了moss 2007 ,客户端访问正常,但在该服务器上访问moss的时候,不断提示需要输入用户名密码,并且输入无效. 根据微软知识库解释:当网站使用集成身份验证并具有映射到本机环回地址的名称时,将出现此问题. 解决办法: 方法 1:禁用环回检查 将 DisableStrictNameChecking 注册表项设置为 1. 有关具体操作方法的更多信息,请单击下面的文章编号,以查看 Micro

【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库完成一个法律咨询管理系统.本系统要求类似网页后台管理效果,并且基于局域网内,完成多客户端操作同一数据库,根据权限不同分别执行不同功能模块.核心模块为级联统计类型管理.数据库咨询数据扇形统计.树的操作.咨询数据的管理.手写分页.Excel数据的导出.多用户操作服务器数据等.并支持多用户同时操作,远程连

SharedPreferences实现自动登录记住用户名密码

最近Android项目需要一个自动登录功能,完成之后,特总结一下,此功能依靠SharedPreferences进行实现. SharedPreferences简介 SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_prefs目录下.SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现