You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建数据表时能否使用加密?如何加密Password字段?

SQL数据表加密及密码字段加密方案

一、创建表时能不能用加密机制?

当然可以。SQL提供了多种加密方案,主要分两类:

  • 静态加密:比如透明数据加密(TDE),直接对整个数据库或表的存储数据加密,不用修改业务逻辑,属于存储层面的基础防护。
  • 字段级加密:针对单个敏感字段(比如你的Password)做加密,需要在写入、读取时做对应处理,是保护密码这类敏感数据的核心手段。

注意:你原表里Password字段设为VARCHAR(6)完全不够用——加密后的数据长度远大于6,必须先调整字段类型,比如改成VARCHAR(255)或者固定长度的CHAR(64)(对应SHA-256哈希的长度),不然会出现数据截断问题。调整后的建表语句:

CREATE TABLE Person (
    PersonId INT IDENTITY (1, 1) PRIMARY KEY
   ,Name VARCHAR(100)
   ,Password VARCHAR(255) -- 扩容以容纳加密后的数据
);

二、怎么给Password字段加密?

绝对不要用可逆加密存储密码——密钥一旦泄露,所有密码都会被破解。行业标准做法是使用带盐的单向哈希算法,因为哈希是不可逆的,只能验证密码正确性,无法还原原始密码。

1. 用SQL内置哈希函数(以SQL Server为例)

插入数据时(加盐哈希)

先生成随机盐值,将盐和原始密码拼接后再哈希,盐值可以单独存一个字段,也可以和哈希值用分隔符拼接存储:

-- 示例:插入数据时生成盐并完成哈希
DECLARE @Salt VARBINARY(16) = NEWID() -- 生成随机盐值
DECLARE @RawPassword NVARCHAR(6) = '123456'
DECLARE @HashedPwd VARBINARY(64) = HASHBYTES('SHA2_256', CONCAT(@RawPassword, @Salt))

-- 将哈希值与盐值拼接后存入字段
INSERT INTO Person (Name, Password)
VALUES ('张三', CONVERT(VARCHAR(255), @HashedPwd) + '|' + CONVERT(VARCHAR(36), @Salt))

验证密码时

取出存储的内容,拆分哈希值和盐值,重新计算哈希后对比:

DECLARE @InputPwd NVARCHAR(6) = '123456'
DECLARE @StoredData VARCHAR(255) = (SELECT Password FROM Person WHERE Name = '张三')

-- 拆分存储的哈希值和盐值
DECLARE @StoredHash VARBINARY(64) = CONVERT(VARBINARY(64), LEFT(@StoredData, CHARINDEX('|', @StoredData) - 1))
DECLARE @StoredSalt VARBINARY(16) = CONVERT(VARBINARY(16), RIGHT(@StoredData, LEN(@StoredData) - CHARINDEX('|', @StoredData)))

-- 验证密码逻辑
IF HASHBYTES('SHA2_256', CONCAT(@InputPwd, @StoredSalt)) = @StoredHash
    PRINT '密码正确'
ELSE
    PRINT '密码错误'

2. 应用层加密(更推荐)

如果业务允许,尽量在应用代码中完成密码的加盐哈希操作,再将结果存入数据库。比如Python用bcrypt库,Java用BCrypt库:

import bcrypt

# 生成带盐的哈希密码
raw_pwd = b"123456"
hashed_pwd = bcrypt.hashpw(raw_pwd, bcrypt.gensalt())
# 将hashed_pwd转换为字符串后存入数据库的Password字段

# 验证密码
if bcrypt.checkpw(raw_pwd, hashed_pwd):
    print("密码正确")

这种方式更安全,避免在SQL层面处理敏感数据,同时也更灵活,便于后续更换哈希算法。

3. 可逆加密(绝对不推荐用于密码)

如果特殊场景必须还原密码(比如老旧系统的密码找回,但更合理的做法是走密码重置流程),可以使用SQL的ENCRYPTBYKEY/DECRYPTBYKEY这类对称加密方案,但风险极高——密钥一旦泄露,所有密码都会暴露,绝对不要用在密码存储场景。


内容的提问来源于stack exchange,提问作者Nitu Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:10:30