Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP) / 3 сообщений из 3, страница 1 из 1
01.12.2021, 19:29
    #40116523
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
Зашифровываю текст в PHP:

Код: php
1.
echo @openssl_encrypt('Hello, world!', 'AES-256-CBC', 'monday', 0, 'tuesday');


Вывод:
Код: plaintext
vjhI+ms245e1Pb6SkDsmMQ==

Это значение надо расшифровать средствами SQL Server, ничего дополнительно на него не инсталлируя.

Поскольку с помощью CREATE SYMMETRIC KEY нельзя указывать произвольные ключ и вектор инициализации (используется SHA256 от пароля и случайный вектор соответственно), пробую привлечь стандартные внешние силы, а именно .NET, вызываемый через COM-объекты.

Вот эта программа на VBScript делает то, что надо:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function AES_256_CBC_Decrypt(base64, key, iv)
	Set aes = CreateObject("System.Security.Cryptography.RijndaelManaged")
	Set utf8 = CreateObject("System.Text.UTF8Encoding")
	Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")

	aes.key = utf8.GetBytes_4(Left(key & String(32, Chr(0)), 32))
	aes.iv = utf8.GetBytes_4(Left(iv & String(16, Chr(0)), 16))
	base64Bytes = utf8.GetBytes_4(base64)
	encodedBytes = b64Dec.TransformFinalBlock((base64Bytes), 0, LenB(base64Bytes))
	decryptedBytes = aes.CreateDecryptor().TransformFinalBlock((encodedBytes), 0, LenB(encodedBytes))
	AES_256_CBC_Decrypt = utf8.GetString((decryptedBytes))
End Function

WScript.Echo AES_256_CBC_Decrypt("vjhI+ms245e1Pb6SkDsmMQ==", "monday", "tuesday")



Вывод:
Код: plaintext
Hello, world!

Пытаюсь портировать её на SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @hr int

declare @aes int
execute @hr = sp_OACreate 'System.Security.Cryptography.RijndaelManaged', @aes out
if @hr != 0 throw 50001, @hr, 0

declare @utf8 int
execute @hr = sp_OACreate 'System.Text.UTF8Encoding', @utf8 out
if @hr != 0 throw 50002, @hr, 0 -- Возникает ошибка -2146234334



Меняю порядок создания объектов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @hr int

declare @utf8 int
execute @hr = sp_OACreate 'System.Text.UTF8Encoding', @utf8 out
if @hr != 0 throw 50002, @hr, 0

declare @aes int
execute @hr = sp_OACreate 'System.Security.Cryptography.RijndaelManaged', @aes out
if @hr != 0 throw 50001, @hr, 0 -- Возникает ошибка -2146234334



То есть ошибка возникает всегда при создании второго объекта .NET. Если вместо него создавать что-то не из .NET — например, Scripting.Dictionary, — можно насоздавать сколько угодно.

Что за напасть?
...
Рейтинг: 0 / 0
02.12.2021, 06:41
    #40116603
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
Андрей Усачёв
Что за напасть?

Код ошибки -2146234334 в шестнадцатеричном виде - 0x80131022. Описание этой ошибки - Failed to initialize the Common Language Runtime (все используемые в скрипте объекты - дотнетовские, и них у объявления класса имеется атрибут ComVisible(true)). Причина ошибки описана вот здесь :
SQL Server 2005 and later versions host Common Language Runtime (CLR) and support procedures, functions, triggers, types, and aggregates that are written in CLR languages. In these versions, you cannot load CLR by using extended stored procedures or sp_OA stored procedures.
- странно вообще, что sp_OA отработала при первом запуске.
Так что сделайте обычную дотнетовскую скалярку, внутри неё декриптуйте - там дел на пяток строк кода.

Андрей Усачёв
используется SHA256 от пароля

поубивал бы за такое
...
Рейтинг: 0 / 0
02.12.2021, 12:41
    #40116698
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
Андрей Усачёв,

напишите CLR процедуру или функцию.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP) / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]