基於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

  

 

我也知道這個功能可能也就是大學實訓課作業的等級,求別損.......,之所以寫出來跟大家分享,一是自己寫出來自己想寫的東西滿足感爆棚(嘿嘿),二是想讓高手們看看是不是有哪兒可以改進,邏輯上是不是有問題,或者這種方式是不是不太安全,希望大神們能不吝賜教啊,感激不盡!

 

作者:emsui 

出處:http://www.cnblogs.com/WYD524/ 

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM