如何加密密码列

时间:2011-02-20 23:54:39

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

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

6 个答案:

答案 0 :(得分:10)

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

您还可以使用从服务器本身发出的密钥。

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

答案 1 :(得分:5)

注意:密码哈希不适用于双向加密(流氓dba可以解密它)。它用于以允许验证的方式对其进行散列,而无需向任何人轻易显示密码。较低甚至中等级别的冲突在某些方面 理想 ,因此它允许密码通过(并且不幸的是其他变体)与冲突你永远无法知道真正的密码到底是什么。

<小时/> 一个简单的实现是通过密码运行HashBytes。您比较提供给存储的哈希的(哈希)密码。除非有人准备好彩虹表,否则他们将无法找到原始密码。

INSERT INTO <tbl> (..., passwd) values (...., HashBytes('SHA1', @password))

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

SELECT HashBytes('SHA1', @password);

并将其与输入进行比较。

答案 2 :(得分:3)

你实际上不想加密它,而是在它上面使用哈希函数。除非强烈要求访问未加密的密码。

答案 3 :(得分:2)

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

<强>代码:加密

`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`

答案 4 :(得分:0)

加密&amp;解密示例可以在这里找到:

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

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

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

答案 5 :(得分:-5)

是的,你应该在代码中这样做,你可以使用任何算法加密,我建议你md5它是非常安全的,它不能解密。 :)

例如:

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);
}
相关问题