专栏首页晓晨的专栏.NET Core 使用HMAC算法

.NET Core 使用HMAC算法

一. HMAC 简介

通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的password_md5对比计算md5(password)的结果,如果一致,用户输入的口令就是正确的。

为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度。

如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。

这实际上就是Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

使用hmac和普通hash算法非常类似。hmac输出的长度和原始哈希算法的长度一致。

HMAC算法简介摘自廖雪峰py教程 原文

二. .NET Core 中的使用

.NET Core 中已经由现成的类,可以直接使用,非常方便。主要有五种类型:HMACMD5、HMACSHA1、HMACSHA256、HMACSHA384、HMACSHA512。其使用方法均为一样,输出内容主要有两种,一种是原始字符串,一种是Base64字符串。

以HMACSHA256为例:

Base64

/// <summary>
/// Base64 SHA256
/// </summary>
/// <param name="data">待加密数据</param>
/// <param name="secret">密钥</param>
/// <returns></returns>
public static string EncryptWithSHA256(string data, string secret)
{
    secret = secret ?? "";
    var encoding = Encoding.UTF8;
    byte[] keyByte = encoding.GetBytes(secret);
    byte[] dataBytes = encoding.GetBytes(data);
    using (var hmac256 = new HMACSHA256(keyByte))
    {
        byte[] hashData = hmac256.ComputeHash(dataBytes);
        return Convert.ToBase64String(hashData);
    }
}

原始字符串:

/// <summary>
/// 原始64位 SHA256
/// </summary>
/// <param name="data">待加密数据</param>
/// <param name="secret">密钥</param>
/// <returns></returns>
public static string EncryptWithSHA256Original(string data, string secret)
{
    secret = secret ?? "";
    var encoding = Encoding.UTF8;
    byte[] keyByte = encoding.GetBytes(secret);
    byte[] dataBytes = encoding.GetBytes(data);
    using (var hmac256 = new HMACSHA256(keyByte))
    {
        byte[] hashData = hmac256.ComputeHash(dataBytes);
        return BitConverter.ToString(hashData).Replace("-", "").ToLower();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#一些常用的图片操作方法:生成文字图片 合并图片等

    晓晨
  • .NET Core 对接微信小程序数据解密

    初次遇到需要数据解密的地方是在“获取手机号”,前端组件调用后获得的是加密数据,需要发送到服务端进行解密。

    晓晨
  • C#调用迅雷下载,调用迅雷影音播放

    晓晨
  • 如何查看后端接口数据结构

    如何查看后端接口数据结构?拿echarts来说,首先,使用ajax向后端请求数据,各个值拼接成一个字符串返回

    王小婷
  • 谷歌基情实录:和Jeff Dean在同一台电脑上写代码

    谷歌的伟大有一多半要归功于公司中亲密无间、协同工作的程序猿们!向伟大的猿类童鞋致敬!

    大数据文摘
  • 【译】A Deep-Dive into Flink's Network Stack(1)

    Flink的网络堆栈是组成flink-runtime模块的核心组件之一,是每个Flink工作的核心。 它连接所有TaskManagers的各个工作单元(子任务)...

    yiduwangkai
  • Jeff Dean的激荡人生:我和Sanjay在同一台电脑上写代码

    文章发出之后,Jeff Dean 表示:「我认为这篇文章精准地捕捉了我们的工作风格。」

    机器之心
  • 《纽约客》长文:Jeff Dean和他背后的男人

    谷歌公司正处于空前的紧急状态。上一年10月,谷歌的核心系统停止了工作,这些系统通过在网络上“爬行”来构建“索引”(index)。尽管用户仍然可以在google....

    新智元
  • “德州扑克AI之父”再发新论文:“冷扑大师2.0”要来了?

    最近,Arxiv上的一篇题为《Solving Imperfect-Information Games via Discounted Regret Minimiz...

    新智元
  • 使用 AI Image Creator 在深度学习中做图片预处理

    最近在做一个和对象识别相关的项目,由于团队内技术栈偏向 JavaScript,在已经用 Python 和 Tensorflow 搭建好了对象识别服务器后,为了不...

    腾讯IVWEB团队

扫码关注云+社区

领取腾讯云代金券