/ / Jak korzystać z szyfrowania AES dla dużych wartości w SQL Server? - sql-server, sql-server-2008, szyfrowanie, aes, varbinary

Jak korzystać z szyfrowania AES dla dużych wartości w SQL Server? - sql-server, sql-server-2008, encryption, aes, varbinary

Mam tabelę SQL Server tbl ze schematem

ID int,
LongText varbinary(max)

I mam następujące funkcje do szyfrowania / deszyfrowania LongText podczas wstawiania / pobierania rekordów.

Do szyfrowania:

CREATE FUNCTION Encrypt
(
@ValueToEncrypt varchar(max)
)
RETURNS varbinary(max)
AS
BEGIN
-- Declare the return variable here
DECLARE @Result varbinary(max)

SET @Result = EncryptByKey(Key_GUID("My_Encryption_Symmetric_Key"), @ValueToEncrypt)

-- Return the result of the function
RETURN @Result
END

Do deszyfrowania:

CREATE FUNCTION Decrypt
(
@ValueToDecrypt varbinary(max)
)
RETURNS varchar(max)
AS
BEGIN
-- Declare the return variable here
DECLARE @Result varchar(max)
SET @Result = DecryptByKey(@ValueToDecrypt)

-- Return the result of the function
RETURN @Result
END

Podczas wstawiania i pobierania rekordów wywołuję te funkcje w następujący sposób:

Do wstawienia:

--Open symmetric keys
INSERT INTO tbl
VALUES (1, Encrypt("some long text here"))

Do pobrania:

--Open symmetric keys
SELECT ID, Decrypt(LongText)
FROM tbl

Teraz, gdy próbuję wstawić wartości do tabeli, w przypadku większych wartości pojawia się błąd

Ciąg znaków lub dane binarne będą obcięte.
Oświadczenie zostało wypowiedziane.

Dzieje się tak w przypadku większych wartości, co jest zrozumiałe dla wiadomości. Przeczytałem gdzieś to EncryptByKey/DecryptByKey mają limit 8000 bajtów. Czy to jest przyczyną tego problemu? Jeśli tak, czy istnieje jakieś obejście lub alternatywne podejście, którego mogę użyć? Jeśli nie, to co tutaj robię źle? Jeśli chodzi o moje życie, nie jestem w stanie zrozumieć, na czym polega problem.

Odpowiedzi:

1 dla odpowiedzi № 1

Czy to jest przyczyną tego problemu? Jeśli tak, czy istnieje jakieś obejście lub alternatywne podejście, którego mogę użyć?

Tak, jest i tak jest we wszystkich wersjach. Niestety obejście tego problemu nie jest zbyt smaczne, co powoduje rozbijanie danych wejściowych na rozmiary mniejsze niż maksimum 8000 bajtów i szyfrowanie ich w częściach. Co ciekawe, żadna z tych funkcji nie została ulepszona, jednak hashbytes zostało ulepszone w 2016 roku, aby usunąć ograniczenie 8k.

Inną główną alternatywą w 2008 lub 2012 roku jest skorzystanie z CLR, aby zrobić to za Ciebie, jeśli chcesz, aby pozostało w bazie danych.

Na koniec jest alternatywa „włóż to do aplikacji”, która z pewnością będzie wymagać zmian kodu aplikacji.

W bazie danych lub poza nią

Rodzi to pytanie o to, czyszyfrowanie lub deszyfrowanie powinno odbywać się w bazie danych lub w innej warstwie / warstwie. Istnieją argumenty na każdy sposób, chociaż bezpieczniejszym sposobem jest brak kluczy w bazie danych. Głównym argumentem jest to, że DBA lub administratorzy systemu nie mogą zobaczyć danych.

W SQL Server 2016 próbowano rozwiązać ten problem przez dodanie Zawsze szyfrowane. Chociaż nie jest to bezpośrednia odpowiedź na to, o co prosiłeś, ponieważ dodaje znacznie więcej funkcjonalności niż jest to konieczne, może również służyć jako ewentualny spadek, jeśli zdecydujesz się przejść do 2016 roku.