【问题标题】:how to encrypt the password column如何加密密码列
【发布时间】:2011-06-30 23:12:03
【问题描述】:

我在 SQL Server 2008 r2 中有用户表。还没有加密,但我想至少加密密码,直到应用程序准备好可以更好地处理这个问题。我可以这样做吗?怎么做?手动加密密码。

【问题讨论】:

    标签: sql-server sql-server-2008 encryption


    【解决方案1】:

    您可以使用 SQL Server 加密列,(请参阅:http://msdn.microsoft.com/en-us/library/ms179331.aspx 了解演练)。

    您也可以使用服务器本身提供的密钥。

    使用此方法的风险是,如果您必须进行数据恢复并将数据库移动到不同的服务器,则无法解密该列(需要重置密码)。

    【讨论】:

      【解决方案2】:

      注意:密码散列不适用于 2 路加密(流氓 dba 可以解密)。它旨在以一种允许验证的方式对其进行散列,而无需向任何人简单地显示密码。在某些方面可取低甚至中等级别的冲突,因此它允许密码通过(不幸的是其他变体)有冲突你永远无法知道真正的密码到底是什么。


      一个简单的实现是在密码上运行 HashBytes。您将提供的(散列)密码与存储的散列进行比较。除非有人准备好彩虹表,否则他们将无法找到原始密码。
      INSERT INTO <tbl> (..., passwd) values (...., HashBytes('SHA1', @password))
      

      验证密码时,您获取密码的哈希

      SELECT HashBytes('SHA1', @password);
      

      并将其与输入进行比较。

      【讨论】:

      【解决方案3】:

      您实际上并不想对其进行加密,而是对其使用哈希函数。除非有强烈要求访问未加密的密码。

      【讨论】:

        【解决方案4】:

        我们可以创建一些简单的 sql 函数来加密和解密您网页中的密码列:

        代码:加密

        `CREATE FUNCTION [dbo].[ENCRYPT] 
         (     
        @DB_ROLE_PASSWORD VARCHAR(MAX)
         ) 
        RETURNS VARCHAR(MAX)
         AS    
         BEGIN   
             DECLARE     
             @STR_LEN NUMERIC(10),     
              @ENCRYPTED_PASSWORD VARCHAR(100),  
                 @TRIAL_CHARACTER VARCHAR(1),    
               @TRIAL_NUMBER NUMERIC(4) 
               SET @ENCRYPTED_PASSWORD = NULL     
           SET @STR_LEN =LEN(@DB_ROLE_PASSWORD) 
            DECLARE          
        @I INT        
        SET @I = 1    
            DECLARE      
            @LOOP$BOUND INT
                SET @LOOP$BOUND = @STR_LEN       
         WHILE @I <= @LOOP$BOUND         
                BEGIN  
                    /*             *   SSMA WARNING MESSAGES:             *   O2SS0273: ORACLE SUBSTR FUNCTION AND SQL SERVER SUBSTRING FUNCTION MAY GIVE DIFFERENT RESULTS.             */            
          SET @TRIAL_CHARACTER = SUBSTRING(@DB_ROLE_PASSWORD, @I, 1)     
                 SET @TRIAL_NUMBER = ASCII(@TRIAL_CHARACTER)           
           IF (@TRIAL_NUMBER % 2) = 0            
            SET @TRIAL_NUMBER = @TRIAL_NUMBER - 6    
                 ELSE                 
        SET @TRIAL_NUMBER = @TRIAL_NUMBER - 8    
                  SET @TRIAL_CHARACTER = CHAR(CAST(@TRIAL_NUMBER + @I AS INT)) 
                     SET @ENCRYPTED_PASSWORD = ISNULL(@ENCRYPTED_PASSWORD, '') + ISNULL(@TRIAL_CHARACTER, '') 
                     SET @I = @I + 1          
         END       
         RETURN @ENCRYPTED_PASSWORD 
            END`
        

        代码:解密

        `CREATE FUNCTION [dbo].[DECRYPT] 
        ( 
           @DB_ROLE_PASSWORD VARCHAR(MAX)
        )
        RETURNS VARCHAR(MAX)
        AS 
        
           BEGIN
        
              DECLARE
                 @STR_LEN NUMERIC(10), 
                 @DECRYPTED_PASSWORD VARCHAR(100), 
                 @TRIAL_CHARACTER VARCHAR(1), 
                 @TRIAL_NUMBER NUMERIC(4), 
                 @CHECK_CHARACTER VARCHAR(1), 
                 @V_DB_ROLE_PASSWORD VARCHAR(100)
        
              SET @V_DB_ROLE_PASSWORD = @DB_ROLE_PASSWORD
        
              SET @DECRYPTED_PASSWORD = NULL
        
              SET @STR_LEN = LEN(@V_DB_ROLE_PASSWORD)
        
              DECLARE
                 @I INT
        
              SET @I = 1
        
              DECLARE
                 @LOOP$BOUND INT
        
              SET @LOOP$BOUND = @STR_LEN
        
              WHILE @I <= @LOOP$BOUND
        
                 BEGIN
        
                    /*
                    *   SSMA WARNING MESSAGES:
                    *   O2SS0273: ORACLE SUBSTR FUNCTION AND SQL SERVER SUBSTRING FUNCTION MAY GIVE DIFFERENT RESULTS.
                    */
        
                    SET @TRIAL_CHARACTER = SUBSTRING(@V_DB_ROLE_PASSWORD, @I, 1)
        
                    SET @TRIAL_NUMBER = ASCII(@TRIAL_CHARACTER) - @I
        
                    IF (@TRIAL_NUMBER % 2) = 0
                       SET @TRIAL_NUMBER = @TRIAL_NUMBER + 6
                    /*-IE EVEN*/
                    ELSE 
                       SET @TRIAL_NUMBER = @TRIAL_NUMBER + 8
                    /*-IE ODD*/
        
                    SET @DECRYPTED_PASSWORD = ISNULL(@DECRYPTED_PASSWORD,'') + ISNULL(CHAR(CAST(@TRIAL_NUMBER AS INT)), '')
        
                    SET @I = @I + 1
        
                 END
        
              RETURN @DECRYPTED_PASSWORD
        
           END`
        

        【讨论】:

          【解决方案5】:

          可以在此处找到加密和解密示例:

          http://msdn.microsoft.com/en-us/library/ms179331.aspx

          哈希示例可以在这里找到:

          http://msdn.microsoft.com/en-us/library/ms174415.aspx

          【讨论】:

            【解决方案6】:

            如果您的唯一任务是验证用户输入的密码是否正确,则不应加密密码。您应该改为散列它们。您可以使用任何算法对其进行哈希处理,但我建议使用 MD5,因为它非常安全。1 :)

            例如:

            public string EncodePassword(string originalPassword)
            {
            //Declarations
            Byte[] originalBytes;
            Byte[] encodedBytes;
            MD5 md5;
            
            //Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash    (encoded password)
            md5 = new MD5CryptoServiceProvider();
            originalBytes = ASCIIEncoding.Default.GetBytes(originalPassword);
            encodedBytes = md5.ComputeHash(originalBytes);
            
            //Convert encoded bytes back to a 'readable' string
            return BitConverter.ToString(encodedBytes);
            }
            

            1 编辑(不是原始答案作者):密码的 MD5 是considered insecure,应该使用更健壮的算法。在阅读本文时,您应该对当代算法进行研究。 This post 可能是一个很好的起点。

            【讨论】:

            • 不要使用 md5,它不安全。可靠的碰撞创建现在已经工作了一段时间。 SHA1 也坏了,但碰撞创建需要更长的时间。如果您想要一个安全的哈希算法,请使用 SHA2。它是可靠的,至少目前是这样。
            • MD5 已损坏,不建议使用。
            • MD5 不是“非常安全”。如果您担心安全性,请使用 SHA-256 算法和盐。
            • 这取决于安全性需求,我认为MD5在90%的情况下已经足够了,它真的很容易使用。
            • Sha1 和 Sha2 也很容易使用并且更安全。
            猜你喜欢
            • 2011-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-15
            • 1970-01-01
            • 2011-06-23
            • 2018-01-20
            • 1970-01-01
            相关资源
            最近更新 更多