数据库中存储用户名、密码时如何处理?

本文探讨了如何安全地存储用户密码,采用MD5加密等方法保护用户信息安全,并解释了密码摘要的概念及用户登录验证流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般的项目都有一个用户表,请问在这个表中,你的账号和密码都是明文存储的么?那么怎么防止被别人看见用户的密码呢?

我见过一个项目是这样的,在用户注册时就对用户的密码进行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;
            }
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值