Vždy šifrováno pomocí go-mssqldb

Ovladač go-mssqldb podporuje Always Encrypted pro šifrování na straně klienta a dešifrování citlivých dat. Po zapnutí ovladač automaticky dešifruje data ze zašifrovaných sloupců a šifruje hodnoty parametrů odeslané do šifrovaných sloupců.

Povolit Always Encrypted

Nastavte columnencryption parametr spojení na true:

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

Také musíte importovat alespoň jeden balíček pro poskytovatele sloupcového hlavního klíče (CMK). Bez poskytovatele ovladač nemůže získat přístup ke šifrovacím klíčům.

Poskytovatelé hlavních klíčů sloupců

Ovladač podporuje tři klíčové poskytovatele obchodů. Importujte balíček poskytovatele jako vedlejší efekt importu pro registraci.

Místní certifikát (PFX)

Poskytovatel localcert čte soukromé klíče ze souborů PFX (PKCS #12) v lokálním souborovém systému. Název poskytovatele v metadatech CMK je .pfx

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

Při konfiguraci CMK v SQL Server nastavte cestu klíče na umístění souboru PFX:

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

Pokud je soubor PFX chráněn heslem, nastavte heslo jako proměnnou prostředí nebo pomocí parametru připojení pfxpassword.

úložiště certifikátů Windows

Poskytovatel MSSQL_CERTIFICATE_STORE přistupuje k certifikátům ve Windows Certificate Store. Tento poskytovatel funguje pouze na Windows.

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

Note

Import localcert také registruje poskytovatele Windows Certificate Store na Windows. Není potřeba žádný samostatný import.

Formát cesty klíče CMK je CurrentUser/My/<thumbprint> nebo 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

Poskytovatel akv získává hlavní klíče sloupců z Azure Key Vault.

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

Cesta ke klíči CMK je adresa URL identifikátoru klíče Azure Key Vault:

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>'
);

Poskytovatel Azure Key Vault používá azidentity.DefaultAzureCredential pro autentizaci. Konfigurujte přihlasovací údaje pomocí proměnných prostředí, spravované identity, Azure CLI nebo jiných metod podporovaných knihovnou Azure Identity. Další informace naleznete v tématu Ověřování Pomocí entra ID společnosti Microsoft.

Dotazujte se na šifrované sloupce

S aktivovaným Always Encrypted a registrací poskytovatele fungují dotazy transparentně:

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)
    }
}

Přesně zrovnat typy parametrů

Šifrování parametrů Always Encrypted je přísnější než běžné vázání parametrů. Ovladač žádá SQL Server o šifrovací metadata před odesláním hodnot, takže typ parametru Go musí přesně odpovídat typu sloupce SQL Server.

  • Parametr Go string se ve výchozím nastavení odesílá jako nvarchar.
  • Použijte specifické typy pro ovladače, například mssql.NVarCharMax, mssql.DateTime1, nebo mssql.DateTimeOffset když šifrovaný sloupec používá konkrétnější typ SQL Server.
  • Pokud typ parametru neodpovídá typu šifrovaného sloupce, může dotaz během zjišťování metadat šifrování parametrů selhat s chybou neshody typů.

Například pokud je sloupec zašifrovaný jako nvarchar(max), preferujte mssql.NVarCharMax, když potřebujete přesnou shodu s dlouhým řetězcem:

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

Obecné pokyny k typům parametrů najdete v tématu Mapování datových typů.

Omezení

  • Always Encrypted nefunguje s hromadnými kopírováními.
  • Ovladač azuresql a Always Encrypted lze kombinovat, ale musíte importovat balíček azuread i balíčky poskytovatele klíčů.
  • Šifrování, charvarchar vkládání a aktualizace jsou v současnosti omezené. Preferujte šifrované nchar nebo nvarchar sloupce pro textová data, která musí používat Always Encrypted.
  • Zabezpečené enklávy nejsou podporovány.