Làm cách nào tôi có thể biết thuật toán băm mà SQL Server đã sử dụng để giải mã dữ liệu được mã hóa khi sử dụng hàm DECRYPTBYPASSPHRASE?


12

Câu hỏi của tôi liên quan đến thí nghiệm sau với hai trường hợp:

Phiên bản SQL Server 2017 Express (Microsoft SQL Server 2017 (RTM-CU16)) Phiên bản
SQL Server 2014 Express (Microsoft SQL Server 2014 (SP2-CU18))

Tôi đã sử dụng chức năng ENCRYPTBYPASSPHRASE để mã hóa một văn bản và sử dụng kết quả này dưới dạng @codestext cho DECRYPTBYPASSPHRASE . Kết quả kiểm tra của tôi là:

Bảng kết quả

Theo bản sửa lỗi này của Microsoft ,

[...] SQL Server 2017 sử dụng thuật toán băm SHA2 để băm cụm mật khẩu. SQL Server 2016 và các phiên bản trước của SQL Server sử dụng thuật toán SHA1 không còn được coi là an toàn.

Nhưng làm thế nào để biết thuật toán được sử dụng để mã hóa dữ liệu là gì nếu không có đối số liên quan đến điều đó trên hàm DECRYPTBYPASSPHRASE? Nó có phải là một phần của dữ liệu được mã hóa không?

Theo kết quả kiểm tra của tôi, tôi đoán SQL Server luôn sử dụng phiên bản mới hơn của thuật toán có sẵn để mã hóa dữ liệu, nhưng thử tất cả các thuật toán để giải mã dữ liệu cho đến khi tìm thấy một thuật toán phù hợp hoặc trả về NULL khi không tìm thấy thuật toán tương ứng . Mặc dù đó chỉ là phỏng đoán vì tôi không thể tìm ra cách nào để kiểm tra thuật toán băm SQL Server đã sử dụng để giải mã dữ liệu được mã hóa.

Câu trả lời:


14

Nhưng làm thế nào để biết thuật toán được sử dụng để mã hóa dữ liệu là gì nếu không có đối số liên quan đến điều đó trên hàm DECRYPTBYPASSPHRASE? Nó có phải là một phần của dữ liệu được mã hóa không?

Vâng, đúng điểm.

Tôi sẽ sử dụng như sau cho đầu ra:

DECLARE @Data VARBINARY(MAX)
DECLARE @Text NVARCHAR(MAX) = N'I''ll get you, and your little dog too!'
DECLARE @Phrase NVARCHAR(100) = N'Fly My Pretties!'

SELECT @Data = ENCRYPTBYPASSPHRASE(@Phrase, @Text)

SELECT @Data AS [Encrypted_Data]

SELECT CAST(DECRYPTBYPASSPHRASE(@Phrase, @Data) AS NVARCHAR(MAX))

Nếu tôi chạy ứng dụng này trong ví dụ 2014, tôi sẽ nhận được thông tin sau cho Encrypted_Data: 0x01000000E565142762F62...

Nếu tôi chạy ứng dụng này trong phiên bản 2017 của mình, tôi sẽ nhận được thông tin sau cho Encrypted_Data: 0x020000004D261C666204F...

Những gì nên bật ra là lời mở đầu, nơi bạn có thể thấy phiên bản 2014 bắt đầu 0x01và phiên bản 2017 bắt đầu bằng 0x02. Đây là phiên bản của loại mã hóa được sử dụng. Lưu ý rằng có nhiều hơn chỉ điều này nhưng không cần phải đi vào chi tiết đó cho mục đích của câu trả lời này, cũng không cần phải có kiến ​​thức công khai.

SQL Server 2017 hiểu 0x010x02bởi vì nó mới và biết những điều mới. SQL Server 2014 chỉ hiểu 0x01vì nó cũ hơn và không biết bất kỳ điều gì mới vì những điều mới không được đưa vào.

[...] SQL Server 2017 sử dụng thuật toán băm SHA2 để băm cụm mật khẩu. SQL Server 2016 và các phiên bản trước của SQL Server sử dụng thuật toán SHA1 không còn được coi là an toàn.

Đây không phải là điều tương tự, nhưng nhìn chung phải thực hiện với các khóa Đối xứng được tạo với cùng một vectơ khởi tạo trên cả hai phiên bản. Tôi đã viết blog về điều này khi năm 2017 xuất hiện và nó đã được sửa một chút sau đó với cờ theo dõi phải được sử dụng trong khi trong câu hỏi của bạn không có cờ theo dõi cần thiết cho năm 2017 để đọc dữ liệu 2014 như được hiển thị.


Xin chào, Sean. Bạn có thể cung cấp thông tin chi tiết hơn về cờ theo dõi từ câu trả lời của bạn?
Konstantin Taranov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.