Immer verschlüsselt mit go-mssqldb

Der Treiber go-mssqldb unterstützt Always Encrypted für clientseitige Verschlüsselung und Entschlüsselung sensibler Daten. Wenn aktiviert, entschlüsselt der Treiber automatisch Daten aus verschlüsselten Spalten und verschlüsselt Parameterwerte, die an verschlüsselte Spalten gesendet werden.

Aktivieren Sie Always Encrypted

Setze den Verbindungsparameter columnencryption auf true:

sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&columnencryption=true

Du musst außerdem mindestens ein Spalten-Masterschlüssel-(CMK)-Providerpaket importieren. Ohne Anbieter kann der Fahrer nicht auf die Verschlüsselungsschlüssel zugreifen.

Anbieter von Spaltenhauptschlüsseln

Der Treiber unterstützt drei Key Store Provider. Importiere das Provider-Paket als Nebeneffekt-Import, um es zu registrieren.

Lokales Zertifikat (PFX)

Der localcert Anbieter liest private Schlüssel aus PFX-Dateien (PKCS #12) im lokalen Dateisystem. Der Name des Anbieters in den CMK-Metadaten lautet pfx.

import (
    _ "github.com/microsoft/go-mssqldb"
    _ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)

Beim Konfigurieren des CMK im SQL Server setzen Sie den Schlüsselpfad zum PFX-Dateistandort:

CREATE COLUMN MASTER KEY MyCMK
WITH (
    KEY_STORE_PROVIDER_NAME = 'pfx',
    KEY_PATH = '/path/to/certificate.pfx'
);

Wenn die PFX-Datei passwortgeschützt ist, setzen Sie das Passwort als Umgebungsvariable oder über den Verbindungsparameter pfxpassword .

Windows-Zertifikatspeicher

Der MSSQL_CERTIFICATE_STORE Anbieter greift auf Zertifikate im Windows Certificate Store zu. Dieser Anbieter funktioniert nur unter Windows.

import (
    _ "github.com/microsoft/go-mssqldb"
    _ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)

Hinweis

Der Import localcert registriert außerdem den Windows Certificate Store Anbieter auf Windows. Ein separater Import ist nicht erforderlich.

Das CMK-Schlüsselpfadformat ist CurrentUser/My/<thumbprint> oder LocalMachine/My/<thumbprint>:

CREATE COLUMN MASTER KEY MyCMK
WITH (
    KEY_STORE_PROVIDER_NAME = 'MSSQL_CERTIFICATE_STORE',
    KEY_PATH = 'CurrentUser/My/<CERTIFICATE_THUMBPRINT>'
);

Azure Key Vault (ein Dienst zur sicheren Verwaltung kryptografischer Schlüssel)

Der akv Provider ruft Spalten-Masterschlüssel aus Azure Key Vault ab.

import (
    _ "github.com/microsoft/go-mssqldb"
    _ "github.com/microsoft/go-mssqldb/aecmk/akv"
)

Der CMK-Schlüsselpfad ist die Azure Key Vault-Schlüsselidentifikator-URL:

CREATE COLUMN MASTER KEY MyCMK
WITH (
    KEY_STORE_PROVIDER_NAME = 'AZURE_KEY_VAULT',
    KEY_PATH = 'https://<VAULT_NAME>.vault.azure.net/keys/<KEY_NAME>/<KEY_VERSION>'
);

Der Anbieter von Azure Key Vault verwendet azidentity.DefaultAzureCredential dies für die Authentifizierung. Konfigurieren Sie Zugangsdaten über Umgebungsvariablen, verwaltete Identität, Azure CLI oder andere von der Azure Identity-Bibliothek unterstützte Methoden. Weitere Informationen finden Sie unter Microsoft Entra ID-Authentifizierung.

Verschlüsselte Spalten abfragen

Mit aktiviertem Always Encrypted und einem registrierten Anbieter funktionieren Abfragen transparent:

import (
    "context"
    "database/sql"
    "fmt"
    "log"

    _ "github.com/microsoft/go-mssqldb"
    _ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)

func main() {
    db, err := sql.Open("sqlserver",
        "sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&columnencryption=true")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    ctx := context.Background()

    // Reads automatically decrypt encrypted columns
    var ssn string
    err = db.QueryRowContext(ctx,
        "SELECT SSN FROM Patients WHERE Id = @p1",
        sql.Named("p1", 1)).Scan(&ssn)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("SSN:", ssn)

    // Parameters are automatically encrypted for encrypted columns
    _, err = db.ExecContext(ctx,
        "INSERT INTO Patients (Name, SSN) VALUES (@p1, @p2)",
        sql.Named("p1", "Alice"),
        sql.Named("p2", "123-45-6789"))
    if err != nil {
        log.Fatal(err)
    }
}

Parametertypen genau abgleichen

Die immer verschlüsselte Parameterverschlüsselung ist strenger als die gewöhnliche Parameterbindung. Der Treiber fragt SQL Server vor dem Senden von Werten nach Verschlüsselungsmetadaten, daher muss der Go-Parametertyp genau mit dem Spaltentyp des SQL Server übereinstimmen.

  • Ein Go-Parameter string wird standardmäßig als nvarchar gesendet.
  • Verwenden Sie treiberspezifische Typen wie mssql.NVarCharMax, mssql.DateTime1, oder mssql.DateTimeOffset wenn die verschlüsselte Spalte einen spezifischeren SQL Server-Typ verwendet.
  • Wenn der Parametertyp nicht mit dem verschlüsselten Spaltentyp übereinstimmt, kann die Abfrage während der Parameterverschlüsselungs-Metadatenentdeckung mit einem Typfehler ausfallen.

Wenn eine Spalte beispielsweise mit nvarchar(max) verschlüsselt ist, bevorzugen Sie mssql.NVarCharMax, wenn Sie eine exakte Übereinstimmung mit einer langen Zeichenfolge benötigen:

_, err := db.ExecContext(ctx,
    "INSERT INTO Patients (Notes) VALUES (@p1)",
    sql.Named("p1", mssql.NVarCharMax("Sensitive note text")))

Für allgemeine Leitlinien zum Parametertyp siehe Datentypabbildungen.

Einschränkungen

  • Always Encrypted funktioniert nicht mit Massenkopien.
  • Der Treiber azuresql und Always Encrypted können kombiniert werden, aber Sie müssen sowohl das azuread Paket als auch das Key Provider-Paket importieren.
  • Verschlüsselte char Einfüge- und varchar Aktualisierungsvorgänge sind derzeit eingeschränkt. Verwenden Sie für Textdaten, für die Always Encrypted verwendet werden muss, bevorzugt mit nchar oder nvarchar verschlüsselte Spalten.
  • Sichere Enklaven werden nicht unterstützt.