Шифрування даних за допомогою функції ENCRYPT, Мова запитів SQL, Бази даних, статті

Питання про те, як правильно шифрувати дані і зберігати їх на SQL сервері, є одним з найбільш часто задаються клієнтами питань. Одна з основних проблем, яку я бачу в цій області – це зберігання закритих даних на SQL сервері у відкритому вигляді. Наприклад, якщо пароль зберігається на SQL сервері в незашифрованому вигляді, то зловмисник може легко прочитати всі паролі за допомогою звичайного SELECT запиту. Ви можете розробити ваш власний спосіб для шифрування паролів, а в даній статті ми обговоримо методи, які вже вбудовані в SQL сервер.
Починаючи з SQL сервера версії 6.x, для шифрування даних ви можете застосовувати функцію ENCRYPT, яка використовує той же метод (шифрування), що й опція WITH ENCRYPTION. Це досить об’ємна проблема, яку ми обговоримо після наступного прикладу. При використанні функції ENCRYPT розміщуйте її попереду рядкової змінної, як зазначено нижче:


SELECT ENCRYPT('TestPW1')

В результаті отримаємо:

------------------------------
0x5400650073007400500057003100

(1 row(s) affected)

Давайте підемо далі і перевіримо як ця функція працює. Створюємо тестову таблицю і завантажуємо в неї вихідні дані, як зазначено нижче:


CREATE TABLE Users (
UserID Varchar(10),
UserPW Varchar (20))

INSERT INTO Users values('TestUser1',ENCRYPT('TestPW1'))
INSERT INTO Users values('TestUser2',ENCRYPT('TestPW2'))
INSERT INTO Users values('TestUser3',ENCRYPT('TestPW3'))
INSERT INTO Users values('TestUser4',ENCRYPT('TestPW4'))

Якщо ви тепер виконаєте вибірку даних з цієї таблиці, то результат буде представлений в зашифрованому вигляді. Зверніть увагу на те, що результати виконання SELECT ENCRYPT ('TestPW1') відрізняються від результатів вибірки даних з таблиці Users після її заповнення. Алгоритм, який SQL сервер використовує для шифрування даних, є відносно простим і розрізняє регістр до тих пір, поки він не збережений в таблиці. Після цього він стає дуже складним для розшифровки. Можливість зберегти дані в зашифрованому поле може використовуватися для зберігання паролів. Ви не можете розшифрувати назад дані, які вже зашифровані і збережені в таблиці. Єдине, що ви можете зробити, так це порівняти дані, як зазначено нижче:


SELECT * from Users where UserID = 'TestUser2' 
and UserPW = ENCRYPT('TestPW2')

Не забудьте, що вищевказана функція працює з урахуванням регістру. Якщо ви вважаєте за краще не використовувати регістр, то краще зберігати всі дані в верхньому регістрі використовуючи функцію UPPER. Функцію UPPER необхідно буде використовувати як в INSERT вираженні, так і в SELECT вираженні, які згадувалися вище. Наприклад, вираз INSERT повинне буде виглядати наступним чином:


INSERT INTO USERS values('TestUser1',ENCRYPT(UPPER('TestPW1')))

SELECT * from Users where UserID = 'TestUser2'
and UserPW = ENCRYPT(UPPER('TestPW2'))

Зверніть також увагу, що коли ви переглядаєте дані у вищевикладеному прикладі, то їх видима довжина відрізняється від дійсної, що є ознакою добре зашифрованих даних.


UserID     UserPW
---------- --------------------
TestUser1 T
TestUser2 T
TestUser3 T
TestUser4 T

(4 row(s) affected)

Але насправді, якщо ви перевірите довжину поля з використанням функції LEN, то ви отримаєте фактичну довжину поля.


userid     Length
---------- -----------
TestUser1 14
TestUser2 14
TestUser3 14
TestUser4 14

(4 row(s) affected)

Цей результат засвідчує, що довжина поля відображає довжину вже зашифрованих даних, а не довжину вихідних даних. А тепер (поговоримо) про великі недоліки, згадуваних раніше. Ця збережена процедура не підтримується Microsoft і може бути легко змінена або вилучені. Хорошим прикладом стало зміна цієї функції між версіями SQL сервер 6.5 і 7.0. Іншим важливим питанням є дешифрування. Очевидно, Microsoft не робить це просто і зашифровані дані можуть бути легко розшифровані тільки з використанням методу порівняння, який я показував раніше. Якщо ви не хочете використовувати цей метод для шифрування ваших паролів, то існують інші, більш досконалі. Ці методи є більш стійкими і більш захищеними ніж той, який ми обговорювали. Наприклад, Les Smith опублікував дві статті, в яких показано як використовувати Java або COM для шифрування паролів. Їх можна знайти за адресою:

www.sqlservercentral.com/columnists/lsmith/usingjavatoencryptpasswords.asp
Якщо захищеність ваших даних є справді важливою, то функція ENCRYPT - це зовсім не те, Що вам потрібно. Замість неї краще використовувати один з декількох уже реалізованих методів, про які Les Smith згадує у своїх статтях. Ці методи шифрування не будуть змінюватися від версії до версії, але вимагають трохи більше роботи.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*