HASHBYTES不是脱敏而是哈希计算,不可逆且丢失原始语义;真正脱敏需掩码表达式如LEFT(mobile,3)+'**'+RIGHT(mobile,4),保留可读性与业务可用性。
直接用 HASHBYTES 对手机号、身份证号做“脱敏加密”是常见误解。它生成的是不可逆哈希值(如 0x... 二进制),原始数据完全丢失,无法还原——这不符合脱敏定义(脱敏要求可读性+部分隐藏,比如 138****1234)。真正需要的不是哈希,而是掩码表达式或动态字符串处理。
典型错误场景:把用户手机号 '13812345678' 传给 HASHBYTES('SHA2_512', @phone),存下 64 字节二进制,再转成十六进制字符串显示——结果是一串无意义乱码,业务方根本认不出这是谁的号码,也无法用于短信校验、去重等下游逻辑。
HASHBYTES 返回 varbinary,直接 SELECT 会显示为 0x...,需额外 CONVERT(VARCHAR, ..., 2) 转换,徒增开销脱敏必须在查询输出阶段做,不改源数据,只改 SELECT 结果。SQL Server 中推荐直接写掩码逻辑,例如:
SELECT id, LEFT(mobile, 3) + '****' + RIGHT(mobile, 4) AS mobile FROM users
ISNULL(LEFT(mobile, 3), '') + '****' + ISNULL(RIGHT(mobile, 4), '')
LEFT(id_card, 6) + '********' + RIGHT(id_card, 4)
@col_name),必须用动态 SQL + sp_executesql,且提前校验字段是否在白名单中,防注入f_mask_mobile(@mobile),再在 SELECT 中调用,便于复用和测试仅当目标是“防明文落库”且无需还原时才适用,比如密码存储。此时必须配合盐值和强算法:
CRYPT_GEN_RANDOM(16) 每用户独立生成,不能复用'SHA2_256' 或 'SHA2_512',禁用 'MD5' 和 'SHA1'
哈希的本质是单向校验,不是加密传输也不是脱敏展示——混淆这点,容易在合规审计时被直接否决。