Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El go-mssqldb driver admite Always Encrypted para el cifrado y descifrado del lado cliente de datos confidenciales. Cuando está habilitado, el controlador descifra automáticamente los datos de columnas cifradas y cifra los valores de los parámetros enviados a columnas cifradas.
Habilitar Siempre Cifrado
Establece el columnencryption parámetro de conexión en true:
sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&columnencryption=true
También necesitas importar al menos un paquete de proveedor de clave maestra de columna (CMK). Sin un proveedor, el controlador no puede acceder a las claves de cifrado.
Proveedores de claves maestras de columna
El controlador soporta tres proveedores clave de tienda. Importa el paquete del proveedor como un efecto secundario para registrarlo.
Certificado local (PFX)
El localcert proveedor lee claves privadas de archivos PFX (PKCS #12) en el sistema de archivos local. El nombre del proveedor en los metadatos CMK es pfx.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)
Al configurar la CMK en SQL Server, establece la ruta de la clave hasta la ubicación del archivo PFX:
CREATE COLUMN MASTER KEY MyCMK
WITH (
KEY_STORE_PROVIDER_NAME = 'pfx',
KEY_PATH = '/path/to/certificate.pfx'
);
Si el archivo PFX está protegido por contraseña, establece la contraseña como variable de entorno o a través del pfxpassword parámetro de conexión.
Almacén de certificados de Windows
El MSSQL_CERTIFICATE_STORE proveedor accede a los certificados en la Tienda de Certificados de Windows. Este proveedor solo funciona en Windows.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/localcert"
)
Note
La localcert importación también registra el proveedor de la Tienda de Certificados de Windows en Windows. No se necesita importación separada.
El formato de ruta de clave CMK es CurrentUser/My/<thumbprint> o 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
El proveedor akv recupera claves maestras de columna de Azure Key Vault.
import (
_ "github.com/microsoft/go-mssqldb"
_ "github.com/microsoft/go-mssqldb/aecmk/akv"
)
La ruta de clave CMK es la URL del identificador de clave de 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>'
);
El proveedor de Azure Key Vault lo utiliza azidentity.DefaultAzureCredential para autenticación. Configura las credenciales mediante variables de entorno, identidad gestionada, CLI de Azure u otros métodos soportados por la biblioteca de Identidad de Azure. Para obtener más información, consulte Autenticación de Id. de Microsoft Entra.
Consulta columnas cifradas
Con Siempre Cifrado habilitado y un proveedor registrado, las consultas funcionan 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)
}
}
Hacer coincidir exactamente los tipos de parámetros
El cifrado de parámetros de Always Encrypted es más estricto que la vinculación de parámetros convencional. El controlador solicita a SQL Server metadatos de cifrado antes de enviar valores, por lo que el tipo de parámetro Go debe coincidir estrechamente con el tipo de columna de SQL Server.
- Por defecto, un parámetro de Go
stringse envía comonvarchar. - Utiliza tipos específicos de controladores como
mssql.NVarCharMax,mssql.DateTime1, omssql.DateTimeOffsetcuando la columna cifrada utiliza un tipo de SQL Server más específico. - Si el tipo de parámetro no coincide con el tipo de columna cifrado, la consulta puede fallar durante el descubrimiento de metadatos de cifrado de parámetros con un error de desajuste de tipo.
Por ejemplo, si una columna cifrada es nvarchar(max), prefiero mssql.NVarCharMax cuando necesitas una coincidencia exacta de cadenas grandes:
_, err := db.ExecContext(ctx,
"INSERT INTO Patients (Notes) VALUES (@p1)",
sql.Named("p1", mssql.NVarCharMax("Sensitive note text")))
Para orientación general sobre tipos de parámetros, véase Mapeos de tipos de datos.
Limitations
- Siempre encriptado no funciona con operaciones de copia masiva.
- El controlador
azuresqly Always Encrypted se pueden combinar, pero debes importar tantoazureadcomo los paquetes del proveedor de claves. - Actualmente, las inserciones y actualizaciones cifradas de
charyvarcharestán limitadas. Prefiera columnasncharonvarcharcifradas para los datos de texto que deban usar Always Encrypted. - No se soportan enclaves seguros.