Alltid krypterad med go-mssqldb

Drivrutinen go-mssqldb stöder Always Encrypted för klientbaserad kryptering och dekryptering av känslig data. När den är aktiverad dekrypterar drivrutinen automatiskt data från krypterade kolumner och krypterar parametervärden som skickas till krypterade kolumner.

Aktivera Alltid krypterat

Sätt anslutningsparametern columnencryption till true:

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

Du behöver också importera minst ett leverantörspaket för kolumnhuvudnyckel (CMK). Utan en leverantör kan drivrutinen inte komma åt krypteringsnycklarna.

Leverantörer av huvudnycklar för kolumner

Drivrutinen stödjer tre nyckellagerleverantörer. Importera leverantörspaketet som en bieffektsimport för att registrera det.

Lokalt certifikat (PFX)

Leverantören localcert läser privata nycklar från PFX (PKCS #12)-filer på det lokala filsystemet. Leverantörens namn i CMK-metadata är pfx.

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

När du konfigurerar CMK i SQL Server, ställ in nyckelvägen till PFX-filens plats:

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

Om PFX-filen är lösenordsskyddad, sätt lösenordet som en miljövariabel eller via anslutningsparametern pfxpassword .

Windows certifikatlager

Leverantören MSSQL_CERTIFICATE_STORE får tillgång till certifikat i Windows Certificate Store. Denna leverantör fungerar endast på Windows.

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

Note

Importen localcert registrerar också Windows Certificate Store-leverantören på Windows. Ingen separat import behövs.

CMK-nyckelvägsformatet är CurrentUser/My/<thumbprint> eller LocalMachine/My/<thumbprint>:

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

Azure 密钥保管库

Leverantören akv hämtar kolumnens masternycklar från Azure Key Vault.

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

CMK-nyckelsökvägen är Azure Key Vault-nyckelidentifierarens 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>'
);

Azure Key Vault-leverantören använder azidentity.DefaultAzureCredential för autentisering. Konfigurera legitimationer via miljövariabler, hanterad identitet, Azure CLI eller andra metoder som stöds av Azure Identity-biblioteket. Mer information finns i Microsoft Entra ID-autentisering.

Sök krypterade kolumner

Med Always Encrypted aktiverat och en leverantör registrerad fungerar förfrågningar 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)
    }
}

Matcha parametertyper exakt

Alltid krypterad parameterkryptering är striktare än vanlig parameterbindning. Drivrutinen ber SQL Server om krypteringsmetadata innan värden skickas, så Go-parametertypen måste matcha SQL Server-kolumntypen noggrant.

  • En parameter i Go string skickas som standard som nvarchar.
  • Använd drivrutinsspecifika typer såsom mssql.NVarCharMax, mssql.DateTime1, eller mssql.DateTimeOffset när den krypterade kolumnen använder en mer specifik SQL Server-typ.
  • Om parametertypen inte matchar den krypterade kolumntypen kan frågan misslyckas vid metadataupptäckt vid parameterkryptering med ett typfel.

Till exempel, om en krypterad kolumn är nvarchar(max), föredrar mssql.NVarCharMax när du behöver en exakt matchning med stora strängar:

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

För allmän vägledning om parametertyper, se Datatypmappningar.

Limitations

  • Always Encrypted fungerar inte med masskopieringsoperationer.
  • Drivrutinen azuresql och Always Encrypted kan kombineras, men du måste importera både paketen azuread och nyckelleverantörspaketen.
  • Krypterade char och varchar inlägg och uppdateringar är för närvarande begränsade. Föredra krypterade nchar eller nvarchar kolumner för textdata som måste använda Always Encrypted.
  • Säkra enklaver stöds inte.