在SQL Server数据库的实际使用中,用户身份证号、银行卡号、手机号这类敏感字段如果直接以明文形式存储,一旦发生数据泄露,会给用户和企业带来严重的安全隐患。SQL Server提供了ENCRYPTBYPASSPHRASE函数,支持通过自定义的密码短语对数据进行加密,无需复杂配置即可实现敏感字段的加密存储,适合中小规模的数据加密需求。

ENCRYPTBYPASSPHRASE函数基本语法
ENCRYPTBYPASSPHRASE是SQL Server内置的加密函数,核心作用是通过用户提供的密码短语对输入的数据进行加密,返回加密后的varbinary类型结果。其完整语法如下:
ENCRYPTBYPASSPHRASE (
{ 'passphrase' | @passphrase }
, { 'cleartext' | @cleartext }
[ , { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ]
)
各参数说明如下:
- passphrase:用于加密的密码短语,类型为nvarchar、char、varchar或nchar,长度建议不少于8位,密码复杂度越高加密安全性越好。
- cleartext:需要加密的明文数据,支持nvarchar、char、varchar、binary、varbinary或nchar类型。
- add_authenticator:可选参数,指定是否添加验证器,类型为bit,默认值为0。如果设为1,则需要同时传入authenticator参数。
- authenticator:可选参数,当add_authenticator为1时生效,用于生成验证器的数据,类型为sysname、nvarchar、char、varchar或nchar。
加密敏感字段的完整示例
下面以用户表user_info为例,演示对手机号字段进行加密存储的完整流程,首先创建测试表:
-- 创建用户测试表,手机号字段使用varbinary类型存储加密后的数据
CREATE TABLE user_info (
user_id INT PRIMARY KEY IDENTITY(1,1),
user_name NVARCHAR(50) NOT NULL,
encrypted_phone VARBINARY(200) -- 存储加密后的手机号
)
插入数据时,使用ENCRYPTBYPASSPHRASE函数对手机号进行加密:
-- 定义加密密码短语
DECLARE @encrypt_pass NVARCHAR(50) = 'MySecurePass123!'
-- 插入加密后的手机号数据
INSERT INTO user_info (user_name, encrypted_phone)
VALUES
('张三', ENCRYPTBYPASSPHRASE(@encrypt_pass, '13800138000')),
('李四', ENCRYPTBYPASSPHRASE(@encrypt_pass, '13900139000'))
插入完成后,直接查询encrypted_phone字段会显示二进制加密结果,无法直接读取明文:
-- 查询加密后的数据 SELECT user_id, user_name, encrypted_phone FROM user_info
解密加密字段的方法
加密后的数据需要使用对应的DECRYPTBYPASSPHRASE函数进行解密,该函数是ENCRYPTBYPASSPHRASE的配套解密函数,语法如下:
DECRYPTBYPASSPHRASE (
{ 'passphrase' | @passphrase }
, { 'ciphertext' | @ciphertext }
[ , { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ]
)
解密时需要传入和加密时完全一致的密码短语,才能正确还原明文数据,示例如下:
-- 解密手机号字段,需要传入和加密时相同的密码短语
DECLARE @decrypt_pass NVARCHAR(50) = 'MySecurePass123!'
SELECT
user_id,
user_name,
-- 解密后的结果是varbinary类型,需要转换为原数据类型
CONVERT(NVARCHAR(20), DECRYPTBYPASSPHRASE(@decrypt_pass, encrypted_phone)) AS phone_number
FROM user_info
使用注意事项
在使用ENCRYPTBYPASSPHRASE函数时,需要注意以下几点:
- 密码短语必须妥善保管,一旦密码丢失,加密后的数据将无法解密,造成数据永久丢失。
- 加密后的结果是varbinary类型,存储加密字段的表字段需要设置为varbinary类型,长度需要根据加密后数据的大小合理设置,避免截断。
- 该函数属于对称加密,加密和解密使用同一个密码短语,适合对安全性要求不是极高的场景,如果数据敏感度极高,建议使用SQL Server的证书加密或透明数据加密功能。
- 如果加密时添加了验证器,解密时必须传入相同的验证器参数,否则解密会失败。
注意:ENCRYPTBYPASSPHRASE函数的加密强度低于证书加密,不建议用于加密核心机密数据,仅适合对普通敏感字段做基础加密防护。
适用场景说明
ENCRYPTBYPASSPHRASE函数适合以下场景使用:
| 场景 | 说明 |
|---|---|
| 中小规模敏感字段加密 | 不需要复杂配置,快速实现手机号、邮箱等字段的加密存储 |
| 临时数据加密 | 对临时存储的敏感数据做短期加密,无需长期维护密钥体系 |
| 低安全等级需求场景 | 数据敏感度较低,不需要使用企业级加密方案的业务场景 |
SQL_ServerENCRYPTBYPASSPHRASE字段加密敏感数据加密修改时间:2026-07-13 12:15:26