.NET Core加解密实战系列之——消息摘要与数字签名算法

本文是.NET Core加解密实战系列的一部分,详细介绍了消息摘要算法(MD、SHA、MAC)和数字签名算法(RSA、DSA、ECDSA),通过代码示例展示了它们的实现与应用。文章强调了BouncyCastle库在.NET Core中的重要性,指出MD5和SHA1的安全性问题,并推荐使用更安全的算法。此外,还预告了下一期将讨论对称加密算法。
摘要由CSDN通过智能技术生成

简介

加解密现状,编写此系列文章的背景:

  • 需要考虑系统环境兼容性问题(Linux、Windows)
  • 语言互通问题(如C#、Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题)
  • 网上资料版本不一、或不全面
  • .NET官方库密码算法提供不全面,很难针对其他语言(Java)进行适配

本系列文章主要介绍如何在 .NET Core 中使用非对称加密算法、编码算法、消息摘要算法、签名算法、对称加密算法、国密算法等一系列算法,如有错误之处,还请大家批评指正。

本系列文章旨在引导大家能快速、轻松的了解接入加解密,乃至自主组合搭配使用BouncyCastle密码术包中提供的算法。

本文中代码示例仅列举了比较常见的使用方式(BouncyCastle中提供的算法远不止这些),另外算法DSA和ECDSA我们未在项目中使用过,代码组合性非常多,因此文中部分代码仅供参考。

本系列代码项目地址:https://github.com/fuluteam/ICH.BouncyCastle.git

上一篇文章《.NET Core加解密实战系列之——RSA非对称加密算法》:https://www.cnblogs.com/fulu/p/13100471.html

功能依赖

BouncyCastle(https://www.bouncycastle.org/csharp) 是一个开放源码的轻量级密码术包;它支持大量的密码术算法,它提供了很多 .NET Core标准库没有的算法。

支持 .NET 4,.NET Standard 1.0-2.0,WP,Silverlight,MonoAndroid,Xamarin.iOS,.NET Core

功能 依赖
Portable.BouncyCastle Portable.BouncyCastle • 1.8.5

消息摘要算法

消息摘要算法分为三类:

  • MD 2/4/5(Message Digest Algorithm 2/4/5):消息摘要算法 MD2、MD4、MD5
  • SHA(Secure Hash Algorithm):安全散列算法
  • MAC(Message Authentication Code):消息认证码

MD算法

MD消息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

家族发展史
  • MD2算法:

    1989年,著名的非对称算法RSA发明人之一麻省理工学院教授罗纳德·李维斯特开发了MD2算法。这个算法首先对信息进行数据补位,使信息的字节长度是16的倍数。再以一个16位的检验和做为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由此诞生。

  • MD4算法:

    1990年,罗纳德·李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。MD4算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。

  • MD5算法:

    1991年,继MD4算法后,罗纳德·李维斯特教授开发了MD5算法,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度大大提高,MD算法的最终结果都是产生一个128位的信息摘要。这也是MD系列算法的特点。

    1996年,该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。

    2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

应用场景

消息摘要算法是不可逆的,所以信息摘要场景主要被用来验证信息的完整性,防止信息被篡改,主要场景如下:

  • 验签:对要发送的数据做MD5(一般加slat)MD5值和数据一同发送,接收方接受数据做同样的MD5计算,比较MD5值是否一致
  • 密码保护:比如用户密码存储上,一般都是存储MD5值,更高一级的涉及是针对每个用户生成一个随机的slat,然后进MD5(passport + slat)计算,将这个值存储到DB中
代码实现
MD5
public static class MD5
{
    /// <summary>
    /// 哈希计算(使用BouncyCastle)
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static byte[] Compute(string s)
    {
        if (string.IsNullOrEmpty(s))
        {
            throw new ArgumentNullException(nameof(s));
        }
        var digest = new MD5Digest();
        var resBuf = new byte[digest.GetDigestSize()];
        var input = Encoding.UTF8.GetBytes(s);

        digest.BlockUpdate(input, 0, input.Length);
        digest.DoFinal(resBuf, 0);

        return resBuf;
    }

    /// <summary>
    /// 哈希计算(不使用BouncyCastle)
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static byte[] Compute2(string s)
    {
        if (string.IsNullOrE
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值