node-mssql(依赖tedious)是否支持SQL Server列加密/Always Encrypted及使用方法
node-mssql对SQL Server Always Encrypted的支持及使用方法
支持情况
最新版本的node-mssql完全支持SQL Server的Column Encryption / Always Encrypted特性。因为node-mssql底层依赖的tedious库已实现该特性支持,node-mssql会直接复用这一能力。
使用步骤
1. 安装/更新依赖
确保使用最新版node-mssql(会自动关联兼容的tedious版本):
npm install mssql@latest
2. 配置连接参数
在连接配置中需启用列加密设置,并根据密钥存储方式配置对应密钥提供者,以下是两种常见场景示例:
场景1:使用Windows本地证书存储
const sql = require('mssql'); const config = { user: '你的数据库账号', password: '你的数据库密码', server: '你的SQL Server地址', database: '目标数据库名', options: { encrypt: true, // Always Encrypted依赖基础SSL加密 columnEncryptionSetting: 'Enabled', // 启用列加密功能 cryptoCredentialsDetails: { // 填写SQL Server中配置的列主密钥对应的证书指纹 certificateThumbprint: '你的证书指纹' } } };
场景2:使用Azure Key Vault
const sql = require('mssql'); const { DefaultAzureCredential } = require('@azure/identity'); const config = { user: '你的数据库账号', password: '你的数据库密码', server: '你的SQL Server地址', database: '目标数据库名', options: { encrypt: true, columnEncryptionSetting: 'Enabled', // 传入Azure身份凭证,用于访问Key Vault中的密钥 azureKeyVaultCredentials: new DefaultAzureCredential() } };
3. 执行数据库操作
配置完成后,可像正常操作数据库一样读写加密列,node-mssql会自动处理加密和解密:
查询加密列
async function queryEncryptedData() { try { await sql.connect(config); const result = await sql.query`SELECT id, encrypted_phone FROM user_info WHERE id = 5`; console.log('查询结果:', result.recordset); // encrypted_phone字段会自动解密为明文 } catch (err) { console.error('查询失败:', err); } finally { await sql.close(); } } queryEncryptedData();
插入数据到加密列
async function insertEncryptedData() { try { await sql.connect(config); const result = await sql.query`INSERT INTO user_info (name, encrypted_phone) VALUES ('张三', '138xxxx1234')`; console.log('插入成功,影响行数:', result.rowsAffected); } catch (err) { console.error('插入失败:', err); } finally { await sql.close(); } } insertEncryptedData();
注意事项
- 需确保SQL Server端已完成Always Encrypted配置:包括创建列主密钥、列加密密钥,以及为目标列启用加密规则。
- 客户端需具备密钥存储的访问权限:本地证书需安装在客户端机器的证书存储中,Azure Key Vault需为客户端身份配置密钥读取权限。
- 避免对加密列使用需明文计算的SQL函数(如
LIKE、字符串拼接等),这类操作无法在客户端解密后执行,会触发SQL Server报错。
内容的提问来源于stack exchange,提问作者Jithu
相关产品推荐
相关产品推荐

