首页 > 其他分享 >MD5加密的基本常识和封装类

MD5加密的基本常识和封装类

时间:2023-07-26 21:47:51浏览次数:28  
标签:加密 string 数字签名 封装 哈希 基本常识 sb MD5

MD5加密的基本常识和封装类

MD5(Message Digest Algorithm 5)是一种常见的哈希算法,用于将任意长度的数据转换为固定长度的(通常是128位或16字节)哈希值。它是MD家族中的第五个算法,广泛用于数据校验、数字签名、密码存储等领域。MD5是单向函数,即无法从生成的哈希值反推出原始数据,这也是其常用于对敏感信息进行加密或签名的原因之一。

1. MD5的原理

MD5算法的核心原理是基于位操作、逻辑运算和模运算,对输入的数据进行多轮循环处理,生成最终的128位哈希值。具体步骤如下:

  1. 填充数据: 将原始数据填充至512位的倍数(64字节)。

  2. 初始值: 初始化4个32位的寄存器(A、B、C、D),用作哈希的中间结果。

  3. 分组处理: 将填充后的数据分成512位(64字节)的分组,每个分组进行下面的处理。

  4. 循环压缩: 将每个分组进行四轮循环压缩,每轮循环使用不同的非线性函数(F、G、H、I)和常量。

  5. 合并结果: 将每个分组经过四轮循环压缩后的中间结果与初始值相加,得到新的中间结果。

  6. 输出: 最后,将四个寄存器的内容按照从低位到高位的顺序连接起来,得到128位的MD5哈希值。

2. MD5的应用

MD5在计算机领域有广泛的应用,包括但不限于以下几个方面:

  1. 数据完整性校验: 在数据传输过程中,使用MD5计算数据的哈希值,接收方根据接收到的数据和哈希值重新计算哈希值,并与接收到的哈希值进行对比,以验证数据的完整性和是否被篡改。

  2. 数字签名: 在数字签名中,对原始数据使用MD5进行哈希计算,然后使用私钥对哈希值进行加密生成数字签名。接收方使用公钥解密数字签名,再对原始数据进行MD5哈希计算,并与解密后的签名对比,以验证数据的来源和完整性。

  3. 密码存储: 在密码存储中,不应该将明文密码直接存储在数据库中,而是将密码进行MD5哈希后再存储。用户登录时,输入的密码也进行MD5哈希后与数据库中存储的哈希值进行比较,从而验证密码是否正确。

  4. 防篡改校验: 在软件发布过程中,可以对软件文件进行MD5哈希计算,并将哈希值与官方发布的哈希值进行比较,从而验证软件是否被篡改。

需要注意的是,由于MD5算法的特性,它已经不再被认为是一种安全的哈希算法。因为MD5容易受到碰撞攻击(collision attack),即找到两个不同的输入数据,经过MD5计算后得到相同的哈希值。因此,在安全性要求较高的场景下,应该使用更强大、不易受到碰撞攻击的哈希算法,如SHA-256或SHA-3。

3. MD5加密封装类

/// <summary>
/// 不可逆加密
/// 1 防止被篡改
/// 2 防止明文存储
/// 3 防止抵赖,数字签名
/// </summary>
public class MD5Encrypt
{
    #region MD5
    /// <summary>
    /// MD5加密,和动网上的16/32位MD5加密结果相同,
    /// 使用的UTF8编码
    /// </summary>
    /// <param name="source">待加密字串</param>
    /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
    /// <returns>加密后的字串</returns>
    public static string Encrypt(string source, int length = 32)//默认参数
    {
        if (string.IsNullOrEmpty(source)) return string.Empty;
        HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
        byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
        byte[] hashValue = provider.ComputeHash(bytes);
        StringBuilder sb = new StringBuilder();
        switch (length)
        {
            case 16://16位密文是32位密文的9到24位字符
                for (int i = 4; i < 12; i++)
                {
                    sb.Append(hashValue[i].ToString("x2"));
                }
                break;
            case 32:
                for (int i = 0; i < 16; i++)
                {
                    sb.Append(hashValue[i].ToString("x2"));
                }
                break;
            default:
                for (int i = 0; i < hashValue.Length; i++)
                {
                    sb.Append(hashValue[i].ToString("x2"));
                }
                break;
        }
        return sb.ToString();
    }
    #endregion MD5

    #region MD5摘要
    /// <summary>
    /// 获取文件的MD5摘要
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static string AbstractFile(string fileName)
    {
        using (FileStream file = new FileStream(fileName, FileMode.Open))
        {
            return AbstractFile(file);
        }
    }
    /// <summary>
    /// 根据stream获取文件摘要
    /// </summary>
    /// <param name="stream"></param>
    /// <returns></returns>
    public static string AbstractFile(Stream stream)
    {
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] retVal = md5.ComputeHash(stream);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < retVal.Length; i++)
        {
            sb.Append(retVal[i].ToString("x2"));
        }
        return sb.ToString();
    }
    #endregion
}

标签:加密,string,数字签名,封装,哈希,基本常识,sb,MD5
From: https://www.cnblogs.com/chenhanhans/p/17583615.html

相关文章

  • AES加密的基本常识和封装类
    AES加密的基本常识和封装类AES(AdvancedEncryptionStandard)是一种对称密钥加密算法,被广泛用于保护敏感数据的安全性。它是一种块加密算法,意味着它将明文数据分成固定大小的块,并使用相同的密钥对每个块进行独立加密。AES算法支持不同的密钥长度,包括128位、192位和256位密钥。一......
  • DES加密的基本常识和封装类
    DES加密的基本常识和封装类DES(DataEncryptionStandard)是一种对称加密算法,它是在1977年由IBM所提出,并在1981年被美国国家标准局(NIST)确定为数据加密标准。DES使用相同的密钥对数据进行加密和解密,因此属于对称加密算法。虽然DES在过去被广泛使用,但由于其较短的密钥长度(56位)导致了......
  • RSA加密的基本常识和封装类
    RSA加密的基本常识和封装类RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密、数字签名和密钥交换等领域。在RSA加密封装中,主要涉及生成密钥对、加密和解密的过程。一、RSA加密封装的过程1.生成密钥对:RSA算法使用一对密钥,包括公钥和私钥。公钥用于加密数据,......
  • AI面试官:MD5、DES、RSA、AES加密
    AI面试官:MD5、DES、RSA、AES加密目录AI面试官:MD5、DES、RSA、AES加密1.什么是MD5加密?它在实际应用中有哪些场景?2.DES加密是什么?它在现实中的应用场景有哪些?3.问题:RSA加密是什么?它在实际应用中的场景有哪些?4.AES加密是什么?它在现实生活中有哪些应用场景?5.请比较MD5、DES、RSA......
  • c++学习:封装、继承、多态
    c++是面向对象的编程语言,相对于c具有封装、继承、多态的特点。封装定义:封装就是将对象的属性和行为封装起来,形成一个有机的整体,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工......
  • md5 加密
    #md5加密对字节加密,返回的结果需要将字节转16进制字符串#导包importhashlibdefget_md5(data,salt=''):data=hashlib.md5(data.encode())#md5加密之前需要先将处理对象转字节#处理之后需要将处理后的数据转字符串#hex是"十六进制"的缩写;......
  • mybaties --- insert的底层封装代码
    //提交,当前的对象到数据库//.save()方法是IService接口提供的,而EmployeeService接口继承了IService接口employeeService.save(employee);/*defaultbooleansave(Tentity){returnSqlHelper.retBool(this.getBaseMapper().insert(entity));}这段代码是一个通用的保存方法......
  • Asp.Net 使用Log4Net (封装帮助类)
    Asp.Net使用Log4Net(封装帮助类)1.创建Log4Net帮助类首先,在你的项目中创建一个Log4Net帮助类,用于封装Log4Net的配置和日志记录逻辑。usinglog4net;usinglog4net.Config;publicclassLogHelper{privatestaticreadonlyILoglog=LogManager.GetLogger(typeof(......
  • MURF20100CTR-ASEMI快恢复对管封装、尺寸、参数
    编辑:llMURF20100CTR-ASEMI快恢复对管封装、尺寸、参数型号:MURF20100CTR品牌:ASEMI芯片个数:2芯片尺寸:102MIL*2封装:TO-220F恢复时间:50ns工作温度:-50°C~150°C浪涌电流:200A正向电流:20A反向耐压:1000V正向压降:1.10V引脚数量:2漏电流:>10uaMURF20100CTR二极管特性:MURF20100......
  • 封装一个Redis服务组件
    结构说明 ServiceCollectionExtensions类1usingcom.project.Redis.Common;2usingMicrosoft.Extensions.Configuration;3usingMicrosoft.Extensions.DependencyInjection;4usingSystem;56namespacecom.project.Redis7{8publicstaticclass......