2015-06-17 19 views
10

Tôi có một cơ sở dữ liệu đã được di chuyển khỏi một phiên bản SQL Server 2008R2 cũ và vào một cụm SQL Server 2012 AlwaysOn. Có một số trường trong cơ sở dữ liệu được mã hóa bằng cách sử dụng các tính năng mã hóa tích hợp của SQL Server (khóa chính, cert, khóa đối xứng.)Mã hóa với cụm AlwaysOn

Tôi đã chạy các lệnh sau đây trên cá thể AO QA của tôi (các bước tương tự chạy trên máy chủ cũ):

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password' 

CREATE CERTIFICATE myCert 
    WITH SUBJECT = 'password' 

CREATE SYMMETRIC KEY myKeyName  
    WITH ALGORITHM = TRIPLE_DES 
    ENCRYPTION BY CERTIFICATE myCert 

Bên cạnh đó tôi phải chạy các lệnh sau để giải mã một cách chính xác các dữ liệu:

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password' 
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY 

Khi tôi chạy lệnh này sau đó tôi thấy tất cả các dữ liệu được giải mã:

OPEN SYMMETRIC KEY myKeyName 
DECRYPTION BY CERTIFICATE myCert 
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users 
CLOSE SYMMETRIC KEY myKeyName 

Cho đến nay rất tốt. Tuy nhiên, nếu tôi chạy các bước tương tự trên sản phẩm của tôi, AO cụm truy vấn này:

select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users 

trả về NULL cho mật khẩu. Để làm điều này điên hơn một chút, tuyên bố này (chạy trong bối cảnh môi trường QA) giải mã tất cả mọi thứ từ cả hai cơ sở dữ liệu tốt:

OPEN SYMMETRIC KEY myKeyName 
DECRYPTION BY CERTIFICATE myCert 

SELECT TOP 1000 
    userid, 
    CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) 
FROM users 

SELECT TOP 1000 
    userid, 
    CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) 
FROM PRODUCTIONAO.prod_database.dbo.users 

CLOSE SYMMETRIC KEY myKeyName 

Tôi không chắc chắn lý do tại sao điều này sẽ làm việc trên dụ QA của tôi, nhưng không phải trong trường hợp sản xuất của tôi. Mọi sự trợ giúp sẽ rất được trân trọng!

+0

Sự khác biệt nếu có giữa hộp QA và hộp Sản phẩm của bạn là gì? Có phải tất cả trên cùng một phần cứng không? Cùng một hệ điều hành? Cùng một Service Pack etc? –

+0

Đã thêm một câu trả lời khác cho bạn. –

+0

Chúng là các cụm AO khác nhau, nhưng hai máy trong mỗi cụm là giống hệt nhau. Các máy ảo. – dparsons

Trả lời

-1

Khi khóa chính của cơ sở dữ liệu được tạo, máy chủ lưu 2 phiên bản khóa. Một phiên bản được mã hóa bằng khóa dịch vụ chính và theo mặc định được máy chủ sử dụng. Phiên bản thứ hai được mã hóa bằng mật khẩu mà bạn cung cấp cho máy chủ khi bạn tạo khóa chính của cơ sở dữ liệu. Phiên bản này thường không được sử dụng. Khi bạn di chuyển cơ sở dữ liệu của bạn vào một môi trường khác (sản xuất trong trường hợp của bạn), máy chủ mới có một khóa dịch vụ chính khác. Vì đây không phải là khóa dịch vụ được sử dụng để mã hóa khóa chính của cơ sở dữ liệu, nên nó cũng không thể được sử dụng để mở khóa chính của cơ sở dữ liệu. Đây là nơi bạn nên sử dụng phiên bản đã được mã hóa bằng mật khẩu của bạn. Bạn cần mở khóa chính bằng mật khẩu, sau đó mã hóa khóa bằng cách sử dụng khóa dịch vụ mới và đóng khóa. Sau khi bạn làm điều đó, khóa chính của cơ sở dữ liệu có thể hoạt động với khóa dịch vụ chính, do đó bạn không cần phải thực hiện lại.

bước/code:

mở thạc sĩ khóa giải mã bằng password = 'WriteYouOriginalPasswordHere'

chìa khóa vạn alter làm thêm mã hóa bởi chủ dịch vụ chủ chốt

chủ gần chốt

+0

Tôi đã chạy các lệnh như tôi đã nói ở trên. – dparsons

3

Lý do cuối cùng của bạn truy vấn hoạt động là do thực tế bạn đang sử dụng khóa/chứng chỉ của cá thể QA để thực hiện giải mã dữ liệu sản xuất. Trong QA bạn có thể tự động giải mã cert với phím cơ sở dữ liệu tổng thể (DMK) kể từ khi nó được mã hóa bởi khóa dịch vụ bảo đảm chất lượng tổng thể (SMK) như sau:

 
Service Master Key (QA) 
    Database Master Key (QA) 
    Certificate (QA) 
     Symmetric Key (QA) 
     Data (Prod) 

trong prod, bạn có một SMK khác nhau nên chỉ tùy chọn để mở DMK bằng cách sử dụng mật khẩu.Có vẻ như bạn chạy sau trong môi trường bảo đảm chất lượng nhưng không phải trong sản:

/* Add service master key encryption to the database master key */ 
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password' 
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY 

Hãy thử điều này trong sản:

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password' 
OPEN SYMMETRIC KEY myKeyName 
DECRYPTION BY CERTIFICATE myCert 
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users 
CLOSE SYMMETRIC KEY myKeyName 

Nếu trả về dữ liệu, bạn cần phải thêm mã hóa SMK để DMK của bạn trong sản xuất (kịch bản đầu tiên). Các tùy chọn khác là sao lưu SMK từ thể hiện nguồn và khôi phục nó trên trung học. Tôi chỉ muốn giới thiệu điều này trong các trường hợp sử dụng HA trong đó các cá thể là các đối tác thất bại và cả hai đều ở trong cùng một môi trường. Chia sẻ SMK giữa QA và prod là một thực tế không tốt.

Các vấn đề liên quan