Her Zaman Go-mssqldb ile Şifrelenmiştir

Sürücü, go-mssqldb istemci tarafı şifreleme ve hassas verilerin şifrelenmesi için Always Encrypted özelliğini destekler. Etkinleştirildiğinde, sürücü şifrelenmiş sütunlardan verileri otomatik olarak çözer ve şifrelenmiş sütunlara gönderilen parametre değerlerini şifreler.

Always Encrypted'i etkinleştir

columnencryption bağlantı parametresini true olarak ayarlayın:

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

Ayrıca en az bir sütun ana anahtarı (CMK) sağlayıcı paketini içe aktarmanız gerekir. Sağlayıcı olmadan sürücü şifreleme anahtarlarına erişemez.

Sütun ana anahtar sağlayıcıları

Sürücü, üç ana mağaza sağlayıcısını destekler. Sağlayıcı paketini yan etki olarak kaydetmek için içe aktarın.

Yerel sertifika (PFX)

Sağlayıcı, localcert yerel dosya sistemindeki PFX (PKCS #12) dosyalarından özel anahtarları okur. CMK meta verisindeki sağlayıcı adı .pfx

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

SQL Server'da CMK yapılandırılırken, anahtar yolunu PFX dosya konumuna ayarlayın:

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

PFX dosyası şifreyle korunuyorsa, şifreyi bir ortam değişkeni veya bağlantı parametresi aracılığıyla pfxpassword ayarlayın.

Windows Sertifika Deposu

Sağlayıcı, MSSQL_CERTIFICATE_STORE sertifikalara Windows Sertifika Mağazası'ndan erişir. Bu sağlayıcı sadece Windows'ta çalışır.

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

Note

localcert içe aktarma, Windows'ta Windows Certificate Store sağlayıcısını da kaydeder. Ayrı bir ithal gerekmez.

CMK anahtar yolu biçimi CurrentUser/My/<thumbprint> veya LocalMachine/My/<thumbprint> şeklindedir:

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

Azure Key Vault

Sağlayıcı, akv sütun ana anahtarlarını Azure Key Vault'tan alır.

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

CMK anahtar yolu, Azure Key Vault anahtar tanımlayıcı URL'sidir:

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 sağlayıcısı kimlik doğrulama için kullanırazidentity.DefaultAzureCredential. Kimlik bilgilerini ortam değişkenleri, yönetilen kimlik, Azure CLI veya Azure Identity kütüphanesi tarafından desteklenen diğer yöntemlerle yapılandırmak. Daha fazla bilgi için bkz. Microsoft Entra Id kimlik doğrulaması.

Şifrelenmiş sütunları sorgulama

Her Zaman Şifreli (Always Encrypted) etkinleştirildiğinde ve bir sağlayıcı kayıtlı olduğunda, sorgular şeffaf şekilde çalışır:

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

Parametre tiplerini tam olarak eşleştirin

Her zaman Şifreli parametre şifrelemesi, sıradan parametre bağlamasından daha katıdır. Sürücü, değerleri göndermeden önce SQL Server'dan şifreleme meta verisi ister, bu yüzden Go parametre tipi SQL Server sütun tipiyle yakından örtüşmelidir.

  • Bir Go string parametresi, varsayılan olarak nvarchar olarak gönderilir.
  • Sürücüye özgü tipler gibi mssql.NVarCharMax, mssql.DateTime1, veya mssql.DateTimeOffset şifrelenmiş sütun daha spesifik bir SQL Server tipi kullandığında kullanın.
  • Parametre tipi şifrelenmiş sütun tipiyle eşleşmiyorsa, sorgu parametre şifreleme meta veri keşfi sırasında tür uyumsuzluğu hatası ile başarısız olabilir.

Örneğin, şifrelenmiş bir sütun nvarchar(max) ise, tam bir büyük dize eşleşmesine ihtiyaç duyduğunuzda mssql.NVarCharMax tercih edin:

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

Genel parametre tipi rehberliği için bkz . Veri tipi eşlemeleri.

Sınırlamalar

  • Always Encrypted, toplu kopyalama işlemleriyle çalışmaz.
  • azuresql sürücüsü ile Always Encrypted birlikte kullanılabilir, ancak hem azuread öğesini hem de anahtar sağlayıcı paketlerini içe aktarmalısınız.
  • Şifreli char ve varchar ekleme ile güncellemeler şu anda sınırlıdır. Her zaman Şifreli olması gereken metin verileri için şifreli nchar veya nvarchar sütunları tercih edin.
  • Güvenli bölgeler desteklenmiyor.