Tôi có mã hóa AES được thực hiện trên hai cột: một trong các cột này được lưu trữ tại cơ sở dữ liệu SQL Server ; khác được lưu trữ tại một cơ sở dữ liệu SQL Server .Làm thế nào để có được khả năng tương thích giữa mã hóa CES và SQL2k8 AES?
Khi cơ sở dữ liệu của cột đầu tiên (2000) không có chức năng gốc để mã hóa/giải mã, chúng tôi đã quyết định thực hiện logic mã hóa ở cấp ứng dụng, với các lớp .NET, cho cả hai. Tuy nhiên, khi cơ sở dữ liệu của cột thứ hai (2008) cho phép loại chức năng này, chúng tôi muốn di chuyển dữ liệu bằng cách sử dụng các hàm cơ sở dữ liệu nhanh hơn, vì việc di chuyển dữ liệu trong SQL 2k nhỏ hơn nhiều so với thứ hai này và nó sẽ kéo dài hơn 50 giờ vì được thực hiện ở cấp ứng dụng.
Vấn đề của tôi bắt đầu tại thời điểm này: sử dụng cùng một khóa, tôi không đạt được kết quả tương tự khi mã hóa giá trị, không cùng kích thước kết quả.
Dưới đây chúng tôi có logic đầy đủ ở cả hai bên .. Đương nhiên là tôi không hiển thị phím, nhưng mọi thứ khác là như nhau:
private byte[] RijndaelEncrypt(byte[] clearData, byte[] Key)
{
var memoryStream = new MemoryStream();
Rijndael algorithm = Rijndael.Create();
algorithm.Key = Key;
algorithm.IV = InitializationVector;
var criptoStream = new CryptoStream(memoryStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
criptoStream.Write(clearData, 0, clearData.Length);
criptoStream.Close();
byte[] encryptedData = memoryStream.ToArray();
return encryptedData;
}
private byte[] RijndaelDecrypt(byte[] cipherData, byte[] Key)
{
var memoryStream = new MemoryStream();
Rijndael algorithm = Rijndael.Create();
algorithm.Key = Key;
algorithm.IV = InitializationVector;
var criptoStream = new CryptoStream(memoryStream, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
criptoStream.Write(cipherData, 0, cipherData.Length);
criptoStream.Close();
byte[] decryptedData = memoryStream.ToArray();
return decryptedData;
}
Đây là mẫu mã SQL:
open symmetric key columnKey decryption by password = N'{pwd!!i_ll_not_show_it_here}'
declare @enc varchar(max)
set @enc = dbo.VarBinarytoBase64(EncryptByKey(Key_GUID('columnKey'), 'blablabla'))
select LEN(@enc), @enc
varbinaryToBase64 này là một hàm sql được thử nghiệm mà chúng tôi sử dụng để chuyển đổi varbinary thành cùng một định dạng mà chúng tôi sử dụng để lưu trữ các chuỗi trong ứng dụng .net.
Kết quả trong C# là: eg0wgTeR3noWYgvdmpzTKijkdtTsdvnvKzh + uhyN3Lo =
Các kết quả tương tự trong SQL2k8 là: AI0zI7D77EmqgTQrdgMBHAEAAACyACXb + P3HvctA0yBduAuwPS4Ah3AB4Dbdj2KBGC1Dk4b8GEbtXs5fINzvusp8FRBknF15Br2xI1CqP0Qb/M4w
Tôi chỉ không có được chưa gì tôi đang làm sai rồi.
Bạn có ý tưởng nào không?
EDIT: Một điểm tôi nghĩ là rất quan trọng: Tôi có một Vector khởi tạo tại mã C#, 16 byte. IV này không được đặt ở khóa đối xứng SQL, tôi có thể làm điều này không?
Nhưng thậm chí không làm đầy IV trong C#, tôi nhận được kết quả rất khác nhau, cả về nội dung và độ dài.
Có điều gì trong tài liệu nêu rõ hai thuật toán mã hóa thực tế giống nhau không? – Joe
họ nói cả hai đều là AES, đúng không? Tôi nghĩ rằng điều này là đủ để đảm bảo một số khả năng tương tác .. –