.NET Core用HMAC SHA加密用户数据后,能否在SQL Server存储过程解密?
HMAC-SHA 在.NET与SQL Server中的常见误区及正确用法
嘿,先给你掰扯清楚一个核心误区:HMAC-SHA(不管是SHA1、SHA256还是SHA512变体)不是加密算法,它是一种不可逆的消息认证机制——也就是说,不存在「解密」这回事儿!
为什么HMAC-SHA不能被解密?
HMAC-SHA的设计目标是验证数据的完整性和真实性:它通过密钥+原始数据生成一串固定长度的哈希值,这个过程是单向的——你没法从生成的HMAC值反推出原始数据。打个比方,就像把食材放进料理机打成糊,没法再把糊变回完整的食材。
如果你实际需求是「加密存储数据(可解密)」
那你选错了工具,应该用**对称加密算法(比如AES)**或者非对称加密。下面给你举个可落地的例子:
.NET中用AES加密数据
using System; using System.Security.Cryptography; using System.Text; public static string EncryptWithAes(string plainText, byte[] key, byte[] iv) { using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (var msEncrypt = new System.IO.MemoryStream()) { using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (var swEncrypt = new System.IO.StreamWriter(csEncrypt)) { swEncrypt.Write(plainText); } return Convert.ToBase64String(msEncrypt.ToArray()); } } } }
SQL Server存储过程中解密AES加密数据
首先要在SQL Server中准备好对称密钥(可通过证书派生),然后用内置函数解密:
CREATE PROCEDURE DecryptAesData @EncryptedData NVARCHAR(MAX), @Key VARBINARY(32), -- AES-256密钥为32字节 @IV VARBINARY(16) -- AES的初始化向量固定为16字节 AS BEGIN DECLARE @DecryptedData NVARCHAR(MAX); -- 示例:用证书解密对称密钥后解密数据 OPEN SYMMETRIC_KEY YourAesSymmetricKey DECRYPTION BY CERTIFICATE YourEncryptionCert; SET @DecryptedData = CONVERT(NVARCHAR(MAX), DECRYPTBYKEY(CONVERT(VARBINARY(MAX), @EncryptedData), 1, @IV)); CLOSE SYMMETRIC_KEY YourAesSymmetricKey; SELECT @DecryptedData AS DecryptedData; END
如果你确实需要用HMAC-SHA(做数据验证)
那在SQL Server里可以重新计算HMAC值并和存储值对比,以此验证数据是否被篡改,而不是解密。
.NET中生成HMAC-SHA256值
using System; using System.Security.Cryptography; using System.Text; public static string GenerateHmacSha256(string data, byte[] key) { using (var hmac = new HMACSHA256(key)) { byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(data)); return Convert.ToBase64String(hashBytes); } }
SQL Server中计算HMAC-SHA256并验证
SQL Server 2016及以上版本支持HMAC_SHA256内置函数,存储过程中可以这样做:
CREATE PROCEDURE VerifyHmacData @OriginalData NVARCHAR(MAX), @StoredHmac NVARCHAR(MAX), @Key VARBINARY(32) -- HMAC验证密钥 AS BEGIN DECLARE @ComputedHmac NVARCHAR(MAX); -- 计算原始数据的HMAC值 SET @ComputedHmac = CONVERT(NVARCHAR(MAX), CONVERT(VARBINARY(MAX), HMAC_SHA256(CONVERT(VARBINARY(MAX), @OriginalData), @Key)), 2); -- 对比验证 IF @ComputedHmac = @StoredHmac SELECT '数据未被篡改,验证通过' AS VerificationResult; ELSE SELECT '数据已被篡改,验证失败' AS VerificationResult; END
内容的提问来源于stack exchange,提问作者SijoX
相关产品推荐
相关产品推荐

