2012-01-08 3 views
1

Я хотел бы зашифровать строки из 1500-2500 символов с помощью асимметричного ключа. Кажется, что RSA_2048 будет шифровать только до 245 символов.Asymmestric-like Шифрование длинных строк

В редакции MSDN Article about EncryptByAsymKey() рекомендуется «не шифровать большие массивы данных с использованием асимметричного ключа. Вместо этого вы должны шифровать данные с помощью сильного симметричного ключа и шифровать симметричный ключ с помощью асимметричного ключа».

Есть ли способ сделать это без необходимости использования пароля Асимметричного ключа? или я иду по этому неправильно?

Declare @plain varchar(max), @cipher varbinary(max); 
Set @plain = 'Greg'; 

CREATE ASYMMETRIC KEY akey WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = '123pass!'; 

CREATE SYMMETRIC KEY skey WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY akey; 

OPEN SYMMETRIC KEY skey DECRYPTION BY ASYMMETRIC KEY akey WITH PASSWORD = '123pass!'; 

Set @cipher = ENCRYPTBYKEY(KEY_GUID('skey'), @plain); 

... write @cipher to db ... 

EDIT: мне еще нужно, чтобы иметь возможность расшифровать данные из другого приложения. Я хочу, чтобы общественность сталкивалась с приложением на нашем веб-сервере, чтобы зашифровать информацию о заказе клиента и записать ее в базу данных. Тогда только сможете расшифровать его, используя другое приложение, работающее на сервере, физически расположенном в офисе.

+0

Что-то вроде этого? http://www.sswug.org/articles/viewarticle.aspx?id=18250 –

+0

Если вы можете переместить шифрование/дешифрование в (.NET?) приложение, а не выполнять его в процедуре T-SQL, я считаю, что вы будет иметь всю гибкость, необходимую для решения ваших проблем. –

+0

Но вы хотите, чтобы иметь возможность расшифровать их из другого приложения, не так ли? – CodesInChaos

ответ

0

Я попытаюсь объяснить, что вам нужно сделать, чтобы выполнить это, и оставить техническую реализацию в настоящее время:

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

После получения данных необходимо создать ключи сеанса (например, случайные ключи AES-128) для шифрования данных с помощью шифрования сеанса с помощью открытого ключа , который содержит открытый ключ. Зашифруйте данные с помощью ключа сеанса и попробуйте стереть ключ из памяти (попробуйте отключить его от подкачки или защитить файл подкачки). Храните зашифрованные данные и вытирайте их из памяти, а также можете. Теперь сохраните ключ сеанса, зашифрованный открытым ключом вместе с данными.

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

Если вы нажимаете «данные, которые должны быть дешифрованы ключом сеанса или если вы также хотите проверить целостность данных, вам также необходимо добавить защиту целостности (например, другой ключ сеанса для выполнения MAC или HMAC с).

Закрытый ключ необходимо хранить в бэкэнде, возможно, используя пароль, смарт-карту, HSM, автономный USB-накопитель или даже строгий контроль доступа в зависимости от ваших потребностей.

0

Если вы хотите одностороннюю шифровку данных, то обычный подход заключается в использовании хэша, а не шифрования. SQL Server имеет встроенную функцию HASHBYTES, зарегистрированную здесь: http://msdn.microsoft.com/en-us/library/ms174415.aspx. Он поддерживает varbinary поля до 8000 байт.

Это, или предложение Aaron-j-spetner функции PWDENCRYPT, являются общепринятыми способами хранения паролей пользователей, поскольку они становятся невосстановимыми, даже если база данных скомпрометирована.

+0

Прошу прощения за то, что я не понял этого в моем вопросе. Мне все же нужно иметь возможность расшифровать данные (из другого приложения). – Greg

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