2013-05-30 1 views
7

Я использую SQL 2000. Строковый столбец «Пароль» находится в таблице «Пользователи». Он имеет около 3 тыс. Строк. Мое требование - зашифровать все значения столбца «Пароль». Кроме того, я должен иметь возможность расшифровать эти зашифрованные поля пароля всякий раз, когда это необходимо.Шифровать столбец в SQL 2000 с помощью кода или SQL-скрипта

Я знаю, что начиная с SQL 2005, для этих требований есть встроенные функционалы. Но я забочусь о SQL 2000.

Пожалуйста, предложите , если есть какой-либо способ достичь моего требования с помощью кода VB или SQL-скрипта. НЕ с любыми сторонними инструментами. Я искал много мест, но безуспешно.

Спасибо.

+1

'VB6' или' VB.NET'? В любом случае, я уверен, что у Google будет много результатов для этого. Почему шифрование должно быть обратимым? Обычно используется только односторонний хеш. –

+0

VB6. Значения строк должны быть сначала зашифрованы. Но, когда это необходимо в будущем, нужно иметь возможность расшифровать это же зашифрованное значение до исходного значения строки. – Kings

ответ

5

Вы можете использовать недокументированные PWDENCRYPT и PWDCOMPARE функции, доступные в SQL Server 2000 -

CREATE TABLE #USER 
(
    LOGIN_ID varchar(20), 
    UserPassword nvarchar(256) 
) 

-- Encrypt & Insert Password 
-- Note: You will have to write UPDATE on existing records 
INSERT #USER VALUES ('my_loginid', PWDENCRYPT('MyPassword1')) 


DECLARE @InputPassword VARCHAR(100) 
DECLARE @IsValid INT = 0 

-- Test for Correct Password 

SET @InputPassword = 'MyPassword1' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 


SELECT @IsValid AS 'Test1'; 

-- Test for Wrong Password 

SET @InputPassword = 'WrongPassword' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 

SELECT @IsValid AS 'Test2' 

DROP TABLE #USER 

Справочные ссылки -

1

Пароли обычно хранятся в хэш-схеме 1 типа (например, SHA1), что означает, что они зашифрованы и никогда не нуждаются в расшифровке. Когда пользователь вводит пароль, ваш код будет хешировать его и проверить, соответствует ли хешированное значение хешируемому значению в базе данных.

Однако, похоже, у вас есть требование также расшифровать пароль. Для этого существует несколько асимметричных алгоритмов (RSA, PGP и т. Д.), Где у вас будет пара частных и открытых ключей. Закрытый ключ хранится в секрете, в то время как открытый ключ может использоваться для других, чтобы иметь возможность зашифровать свою собственную информацию, прежде чем отправлять ее вам. Похоже, что это перебор, потому что только ваш код VB6 должен шифровать данные, а не третьи стороны. Поэтому вы можете просто использовать симметричный алгоритм (например, Blowfish или TripleDES), в котором вы используете одну и ту же кодовую фразу (вместо пары ключей) для шифрования и дешифрования данных. Эта кодовая фраза может храниться в файле конфигурации на сервере. Не забудьте защитить его от неавторизованных пользователей.

Вы видели эту статью? Он использует TripleDES с парольной фразой, которая звучит точно так, как вам нужно. http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx

1

В настоящее время считается неправильной практикой просто шифровать пароли самостоятельно. Часто к каждому паролю добавляется произвольная строка (называемая солью), а затем применяется шифрование. В принципе, не имеет значения, в какой последовательности вы добавляете «соль» и шифруете. Все эти комбинации равны по силе кодирования:

HASH (Pass & Salt) OR HASH (HASH (Pass)+Salt)) OR HASH (HASH (Pass) + HASH (Salt))

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

Это также хорошая практика для обозначения таблиц, поэтому имена таблиц нельзя угадать. Это затрудняет слепые атаки, когда они не могут сразу получить стол с паролями.

Что касается способа шифрования строки.

SQL Server 2000 Там нет встроенных симметричных функций. Имеются 2 асимметричные встроенные функции: BINARY_CHECKSUM и CHECKSUM.

VB VB дает вам уже реализованные алгоритмы, а также инструменты для выполнения вашей собственной реализации. Статья, на которую ссылается @SuperFunkyMonkey имеет ссылки на Security.Cryptography Namespace. Другим симметричным алгоритмом (который вы можете декодировать) является Rijndael.

1

Позвольте мне начать с указания, что вы упомянули, что это был пароль. Надлежащая защита паролей является сложным предметом, но с минимальным минимумом я предлагаю засолить и слить их. SQL Server действительно включает хеш-функцию (pwdencrypt он был в SQL Server 2000, но не был документирован до более поздних версий). Новейшие версии включают Hashbytes, у которых больше опций), но эта хэш-функция не самая безопасная, и вы должны смотреть на другую опции.

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

Если вы действительно хотите их зашифровать, посмотрите в пространстве имен System.Security.Cryptography и в классе Simple3Des, в частности для VB. Здесь есть документация и пошаговое руководство по шифрованию строк в рамках программы here.

 Смежные вопросы

  • Нет связанных вопросов^_^