Mindig titkosítva go-mssqldb-vel

A go-mssqldb meghajtó támogatja a Always Encrypted funkciót kliensoldali titkosításhoz és érzékeny adatok visszafejtéséhez. Ha engedélyezik, az illesztőprogram automatikusan dekódolja az adatokat titkosított oszlopokból, és titkosítja a titkosított oszlopokhoz küldött paraméterértékeket.

Always Encrypted engedélyezése

Állítsuk be a columnencryption kapcsolati paramétert :true

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

Legalább egy oszlop master key (CMK) szolgáltató csomagot is importálnod kell. Szolgáltató nélkül a sofőr nem fér hozzá a titkosítási kulcsokhoz.

Oszlopfőkulcs-szolgáltatók

A meghajtó három kulcsfontosságú boltszolgáltatót támogat. Importáld a szolgáltató csomagot mellékhatású importként, hogy regisztráld.

Helyi tanúsítvány (PFX)

A localcert szolgáltató a PFX (PKCS #12) fájlokból olvassa fel a privát kulcsokat a helyi fájlrendszeren. A szolgáltató neve a CMK metaadatban .pfx

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

A CMK konfigurálásakor az SQL Server-ben állítsuk be a kulcsutat a PFX fájl helyére:

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

Ha a PFX fájl jelszóval védett, állítsd be a jelszót környezeti változóként vagy a pfxpassword kapcsolati paraméteren keresztül.

Windows tanúsítványtároló

A MSSQL_CERTIFICATE_STORE szolgáltató a Windows Tanúsítvány Áruházban éri el a tanúsítványokat. Ez a szolgáltató csak Windows-on működik.

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

Megjegyzés:

Az localcert import regisztrálja a Windows Tanúsítvány Áruház szolgáltatóját is a Windows-on. Nem szükséges külön import.

A CMK kulcsút formátuma vagy CurrentUser/My/<thumbprint>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

A akv szolgáltató az oszlop master kulcsokat az Azure Key Vault-ból szerezi be.

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

A CMK kulcs elérési útja az Azure Key Vault kulcsazonosítójának URL-címe:

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

Az Azure Key Vault szolgáltató azidentity.DefaultAzureCredential használja hitelesítésre. Konfigurálja a hitelesítéseket környezeti változók, kezelt identitás, Azure CLI vagy más, az Azure Identity könyvtár által támogatott módszerek segítségével. További információ: Microsoft Entra ID-hitelesítés.

Titkosított oszlopok lekérdezése

Ha a Always Encrypted engedélyezett és regisztrált szolgáltató van, a lekérdezések átláthatóan működnek:

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

Pontosan egyeztess meg a paramétertípusokat

A Always Encrypted paramétertitkosítás szigorúbb, mint a hagyományos paraméterkötés. Az illezőgép az SQL Server-től titkosítási metaadatokat kér az értékek küldése előtt, így a Go paramétertípusnak szorosan egyeznie kell az SQL Server oszloptípusával.

  • A Go string paramétert alapértelmezés szerint nvarchar formában küldi át.
  • Használjunk illesztő-specifikus típusokat, például mssql.NVarCharMax, mssql.DateTime1, vagy mssql.DateTimeOffset amikor a titkosított oszlop egy specifikusabb SQL Server típust használ.
  • Ha a paramétertípus nem egyezik meg a titkosított oszloptípussal, a lekérdezés meghibásíthat a paraméter-titkosítás metaadat-felderítése során, és típus-eltérési hibát okozhat.

Például, ha egy titkosított oszlop nvarchar(max), akkor válassza inkább a(z) mssql.NVarCharMax elemet, amikor egy nagy karakterlánc pontos egyezésére van szükség:

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

Általános paramétertípus-útmutatóért lásd: Data type mappings.

Limitations

  • A Always Encrypted nem működik tömeges másolási műveletekkel.
  • A azuresql meghajtó és a Always Encrypted kombinálható, de mind a azuread kulcsszolgáltató csomagokat be kell importálni.
  • A titkosított char , varchar beillesztések és frissítések jelenleg korlátozottak. A titkosított nchar vagy nvarchar oszlopokat részesítem előnyben olyan szöveges adatokhoz, amelyeknek Always Encrypted funkciót kell használnia.
  • A biztonságos enklávék nem támogatottak.