как зашифровать столбец пароля - PullRequest
6 голосов
/ 21 февраля 2011

У меня есть пользовательская таблица в SQL Server 2008 r2.Там пока ничего не зашифровано, но я бы хотел, по крайней мере, зашифровать пароли, пока приложение не будет готово, чтобы справиться с этим лучше.Могу ли я сделать это и как?чтобы вручную сделать пароли зашифрованными.

Ответы [ 6 ]

10 голосов
/ 21 февраля 2011

Вы можете зашифровать столбцы с помощью SQL Server (см. http://msdn.microsoft.com/en-us/library/ms179331.aspx для ознакомления).

Вы также можете использовать ключ, выданный самим сервером.

Риск использования этого заключается в том, что если вам придется восстанавливать данные и перемещать БД на другой сервер, будет невозможно расшифровать столбец (потребуется сброс паролей).

5 голосов
/ 21 февраля 2011

Примечание: хеширование пароля не предназначено для двухстороннего шифрования (где мошеннический dba может его расшифровать).Он предназначен для хеширования таким способом, который позволяет выполнять проверку без простого показа пароля кому-либо.Низкий или даже умеренный уровень коллизий в некоторых отношениях желателен , так что он позволяет пароль через (и, к сожалению, другие варианты) , но со коллизиями, которые вы никогда не сможетерасскажите, какой на самом деле был настоящий пароль.


Простая реализация - запуск HashBytes поверх пароля.Вы сравниваете предоставленный (хеш) пароль с сохраненным хешем.Если у кого-то нет готовой радужной таблицы, он не сможет найти оригинальный пароль.
INSERT INTO <tbl> (..., passwd) values (...., HashBytes('SHA1', @password))

При проверке паролей вы берете хэш пароля

SELECT HashBytes('SHA1', @password);

и сравниваетеэто против ввода.

3 голосов
/ 21 февраля 2011

Вы на самом деле не хотите зашифровать его, а просто использовать хеш-функцию на нем. Если нет строгих требований для получения доступа к незашифрованному паролю.

2 голосов
/ 21 февраля 2011

Мы можем создать простую функцию 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`
0 голосов
/ 21 февраля 2011

Примеры шифрования и дешифрования можно найти здесь:

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

Пример хеширования можно найти здесь:

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

0 голосов
/ 21 февраля 2011

да, вы должны сделать это в коде, вы можете использовать любой алгоритм для кодирования, я рекомендую вам 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...