Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O go-mssqldb driver suporta o Always Encrypted para encriptação do lado do cliente e desencriptação de dados sensíveis. Quando ativado, o driver desencripta automaticamente os dados das colunas encriptadas e encripta os valores dos parâmetros enviados para as colunas encriptadas.
Ativar Sempre Encriptado
Defina o columnencryption parâmetro de ligação para true:
sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&columnencryption=true
Também precisa de importar pelo menos um pacote do fornecedor de chave mestra de coluna (CMK). Sem um fornecedor, o driver não pode aceder às chaves de encriptação.
Fornecedores de chaves mestras de colunas
O controlador suporta três fornecedores de repositório de chaves. Importa o pacote do fornecedor como uma importação por efeito secundário para o registar.
Certificado local (PFX)
O localcert fornecedor lê chaves privadas dos ficheiros PFX (PKCS #12) no sistema de ficheiros local. O nome do fornecedor nos metadados CMK é pfx.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)
Ao configurar a CMK no SQL Server, defina o caminho da chave para a localização do ficheiro PFX:
CREATE COLUMN MASTER KEY MyCMK
WITH (
KEY_STORE_PROVIDER_NAME = 'pfx',
KEY_PATH = '/path/to/certificate.pfx'
);
Se o ficheiro PFX estiver protegido por palavra-passe, defina a palavra-passe como variável de ambiente ou através do pfxpassword parâmetro de ligação.
Armazenamento de Certificados do Windows
O MSSQL_CERTIFICATE_STORE fornecedor acede aos certificados na Windows Certificate Store. Este fornecedor funciona apenas no Windows.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)
Note
A localcert importação também regista o fornecedor da Loja de Certificados Windows no Windows. Não é necessária importação separada.
O formato do caminho da chave CMK é CurrentUser/My/<thumbprint> ou 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
O fornecedor akv obtém chaves mestras de coluna do Azure Key Vault.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/akv"
)
O caminho da chave CMK é o URL do identificador de chave do 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>'
);
O fornecedor do Azure Key Vault utiliza azidentity.DefaultAzureCredential para autenticação. Configure credenciais através de variáveis de ambiente, identidade gerida, CLI do Azure ou outros métodos suportados pela biblioteca Azure Identity. Para mais informações, consulte a autenticação do ID Microsoft Entra.
Consultar colunas encriptadas
Com o Always Encrypted ativado e um fornecedor registado, as consultas funcionam de forma transparente:
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)
}
}
Faça corresponder exatamente os tipos de parâmetros
A encriptação de parâmetros do Always Encrypted é mais rigorosa do que a associação comum de parâmetros. O driver pede ao SQL Server metadados de encriptação antes de enviar valores, pelo que o tipo de parâmetro Go deve corresponder de perto ao tipo de coluna do SQL Server.
- Um parâmetro Go
stringé enviado comonvarcharpor predefinição. - Use tipos específicos de driver como
mssql.NVarCharMax,mssql.DateTime1, oumssql.DateTimeOffsetquando a coluna encriptada usa um tipo de SQL Server mais específico. - Se o tipo de parâmetro não corresponder ao tipo de coluna encriptada, a consulta pode falhar durante a descoberta de metadados de encriptação de parâmetros com um erro de incompatibilidade de tipo.
Por exemplo, se uma coluna encriptada for nvarchar(max), prefira mssql.NVarCharMax quando precisar de uma correspondência exata com uma cadeia de caracteres longa:
_, err := db.ExecContext(ctx,
"INSERT INTO Patients (Notes) VALUES (@p1)",
sql.Named("p1", mssql.NVarCharMax("Sensitive note text")))
Para orientações gerais sobre tipos de parâmetros, veja Mapeamentos de tipos de dados.
Limitations
- O Always Encrypted não funciona com operações de cópia em massa.
- O controlador
azuresqle o Always Encrypted podem ser utilizados em conjunto, mas tem de importar tanto o pacoteazureadcomo os pacotes do fornecedor de chaves. - As operações de
charinserção e atualizaçãovarcharencriptadas estão atualmente limitadas. Prefira colunas encriptadasncharounvarcharpara dados de texto que tenham de usar o Always Encrypted. - Os enclaves seguros não são suportados.