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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:52