1. 程式人生 > >資料庫中儲存使用者名稱、密碼時如何處理?

資料庫中儲存使用者名稱、密碼時如何處理?

一般的專案都有一個使用者表,請問在這個表中,你的賬號和密碼都是明文儲存的麼?那麼怎麼防止被別人看見使用者的密碼呢?

我見過一個專案是這樣的,在使用者註冊時就對使用者的密碼進行MD5加密,這樣使用者表中儲存的密碼就是加密的資訊,就算管理員也不能看到使用者的密碼,使用者在登入時輸入賬號和密碼,在後臺把使用者密碼驚醒MD5摘要之後和資料庫的密碼就行比對,如果一致就可以登陸,但是使用者忘記密碼之後就沒有任何人能看到密碼了,只能根據使用者的提示問題重新設定。

確切的說,資料庫中儲存的不是”加密“後的密碼,而是密碼的摘要資訊,通過這個摘要資訊是無法還原出密碼的。使用者登入時拿到原密碼之後,按照相同的演算法,再計算一遍摘要資訊,和資料庫中的摘要資訊做一下比較,如果相同,就認為密碼是正確的。

登入時,我們填寫的是明文密碼,但在資料庫裡儲存的是加密後的密碼,登入時這兩者如何比對?

用相同的加密演算法再次加密你的明文密碼,然後比對資料庫中的密文。相同就表示密碼正確。當然這個其中可能會牽涉到碰撞等問題,但是基本可以不考慮。

可以參考下這個:

        /// <summary>
        /// 對密碼進行MD5加密的函式(新增鹽值:&%#@?,:*
        /// </summary>
        /// <param name="Password"></param>
        /// <returns></returns>
        public static string getEncryPassword(string Password)
        {
            string EncryedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(
                Password + "&%#@?$%)@%($)#_$)*", "md5"); // Or "sha1" 
            return EncryedPassword;
        }
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="strText"></param>
        /// <returns></returns>
        public static string EncryptText(String strText)
        {
            return Encrypt(strText, "&%#@?$%)@%($)#_$)*");
            // return Encrypt(strText,DateTime.Now.ToString() );
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="strText"></param>
        /// <returns></returns>
        public static String DecryptText(String strText)
        {
            return Decrypt(strText, "&%#@?$%)@%($)#_$)*");
            // return Decrypt(strText,DateTime.Now.ToString());
        }


        /// <summary>
        /// 加密函式
        /// </summary>
        /// <param name="strText"></param>
        /// <param name="strEncrKey"></param>
        /// <returns></returns>
        public static String Encrypt(String strText, String strEncrKey)
        {
            Byte[] byKey = { };
            Byte[] IV = { 0x01, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                Byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        /// <summary>
        /// 解密函式
        /// </summary>
        /// <param name="strText"></param>
        /// <param name="sDecrKey"></param>
        /// <returns></returns>
        public static String Decrypt(String strText, String sDecrKey)
        {

            char[] stBase = strText.ToCharArray();
            for (int i = 0; i < stBase.Length; i++)
            {
                if (stBase[i] == ' ')
                {
                    stBase[i] = '+';
                }
            }
            strText = "";
            for (int i = 0; i < stBase.Length; i++)
            {
                strText += stBase[i];
            }
            Byte[] byKey = { };
            Byte[] IV = { 0x01, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            Byte[] inputByteArray = new byte[strText.Length];
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                inputByteArray = Convert.FromBase64String(strText);

                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                System.Text.Encoding encoding = System.Text.Encoding.UTF8;
                return encoding.GetString(ms.ToArray());
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }