powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
3 сообщений из 3, страница 1 из 1
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
    #40116523
Андрей Усачёв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашифровываю текст в 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
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
    #40116603
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Усачёв
Что за напасть?

Код ошибки -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
sp_OACreate не создаёт второй объект (расшифровываю AES-256-CBC, зашифрованный в PHP)
    #40116698
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Усачёв,

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


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