搭配 JDBC 驅動程式使用具備安全記憶體保護區的 Always Encrypted

下載 JDBC 驅動程式

此頁面提供如何使用具有安全記憶體保護區的 Always Encrypted 與 Microsoft JDBC Driver 8.2 for SQL Server (或更高版本) 來開發 Java 應用程式的相關資訊。

安全記憶體保護區功能是現有 Always Encrypted 功能的新增功能。 安全記憶體保護區目的是要解決使用 Always Encrypted 資料時的限制。 之前,使用者只能對 Always Encrypted 資料執行相等比較,且必須擷取資料並進行解密,才能執行其他作業。 安全記憶體保護區可解決這項限制,方法是允許在伺服器端的安全記憶體保護區內部進行純文字資料計算。 安全記憶體保護區是 SQL Server 處理序內受保護的記憶體區域, 可作為受信任的執行環境來處理 SQL Server 引擎內部的敏感性資料。 安全記憶體保護區對於主控電腦上其餘部分的 SQL Server 和其他處理序會顯示為黑盒子。 即使使用偵錯工具,也無法從外部檢視記憶體保護區內部的任何資料或程式碼。

必要條件

  • 確定已在您的開發電腦上安裝 Microsoft JDBC Driver 8.2 for SQL Server (或更高版本)。
  • 驗證環境相依性 (例如 DLL、金鑰儲存區等) 都位於正確的路徑。 具有安全記憶體保護區的 Always Encrypted 是現有 Always Encrypted 功能的附加元件,且共用相似的先決條件。

注意

如果您使用的是舊版的 JDK 8,則可能需要下載並安裝 Java 密碼編譯延伸模組 (JCE) 無限制的強度管轄權原則檔。 請務必閱讀 ZIP 檔案中的讀我檔案,以了解安裝指示及可能的匯出/匯入問題相關詳細資料。

您可以從 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 下載 (英文) 下載原則檔

設定安全記憶體保護區

遵循教學課程:開始在 SQL Server 中使用具有安全記憶體保護區的 Always Encrypted教學課程:開始在 Azure SQL Database 中使用具有 Intel SGX 記憶體保護區的 Always Encrypted教學課程:開始在 Azure SQL Database 中使用具有 VBS 記憶體保護區的 Always Encrypted,即可開始使用安全記憶體保護區。 如需更深入的資訊,請參閱具有安全記憶體保護區的 Always Encrypted

連接字串屬性

若要為資料庫連線啟用記憶體保護區計算,除了啟用 Always Encrypted 之外,您還必須設定下列連接字串關鍵字。

  • enclaveAttestationProtocol - 指定證明通訊協定。

    • 如果您使用的是 SQL Server 和主機守護者服務 (HGS),則此關鍵字的值應為 HGS
    • 如果您使用的是 Azure SQL Database 和 Microsoft Azure 證明,則此關鍵字的值應為 AAS
    • 如果您在無法使用證明服務的環境中使用安全記憶體保護區,則此關鍵字的值應為 NONE。 需要 JDBC 12.2 或更新版本。
  • enclaveAttestationUrl - 指定證明 URL (證明服務端點)。 您必須從證明服務系統管理員取得環境的證明 URL。

使用者必須啟用 columnEncryptionSetting,並正確地設定上述這兩個連接字串屬性,才能從 Microsoft JDBC Driver for SQL Server 啟用具有安全記憶體保護區的 Always Encrypted。

使用安全記憶體保護區

當記憶體保護區連線屬性設定正確時,此功能將會以透明方式運作。 驅動程式會自動判斷查詢是否需要使用安全記憶體保護區。 以下是觸發記憶體保護區計算的查詢範例。 您可以在教學課程:開始在 SQL Server 中使用具有安全記憶體保護區的Always Encrypted教學課程:開始在 Azure SQL Database 中使用具有安全記憶體保護區的Always Encrypted 中,找到資料庫和資料表設定。

豐富的查詢將會觸發記憶體保護區計算:

private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL)) {
    try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SSN LIKE ?")) {
        p.setString(1, "%6818");
        try (ResultSet rs = p.executeQuery()) {
            while (rs.next()) {
                // Do work with data
            }
        }
    }
    
    try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SALARY > ?")) {
        ((SQLServerPreparedStatement) p).setMoney(1, new BigDecimal(0));
        try (ResultSet rs = p.executeQuery()) {
            while (rs.next()) {
                // Do work with data
            }
        }
    }
}

切換資料行的加密也會觸發記憶體保護區計算:

private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL);Statement s = c.createStatement()) {
    s.executeUpdate("ALTER TABLE Employees ALTER COLUMN SSN CHAR(11) NULL WITH (ONLINE = ON)");
}

Java 8 使用者

這項功能需要 RSASSA-PSA 簽章演算法。 此演算法已於 JDK 11 中新增,但並未回溯移植至 JDK 8。 想要搭配 Microsoft JDBC Driver for SQL Server JDK 8 版使用這項功能的使用者,必須載入自己的提供者以支援 RSASSA-PSA 簽章演算法,或包含 BouncyCastleProvider 選擇性相依性。 如果 JDK 8 向後移植此簽章演算法,或 JDK 8 的支援生命週期結束,即會在日後移除該項相依性。

另請參閱

搭配 JDBC 驅動程式使用 Always Encrypted