mbedtls哈希值计算

文章目录

简介

哈希值(Hash Value),也被称为哈希码(Hash Code)、散列值(Hash)、摘要(Digest)或指纹(Fingerprint),是将任意长度的消息或数据通过哈希算法(Hash Function)转换成固定长度的数字串。哈希算法是一种单向函数,具有以下重要特性:

哈希算法的特性

  1. 确定性:
    ◦对于相同的输入数据,哈希算法总是产生相同的哈希值。
    ◦ 例如,无论何时使用相同的哈希算法处理相同的输入数据,结果总是相同的。
  2. 固定长度输出:
    ◦ 无论输入数据的长度如何,哈希算法的输出总是固定长度的。
    ◦ 例如,MD5算法的输出总是128位,SHA-256算法的输出总是256位。
  3. 单向性:
    ◦ 哈希算法是不可逆的,即从哈希值无法还原出原始数据。
    ◦ 这使得哈希算法在密码学中非常有用,例如存储用户密码时,通常存储密码的哈希值而不是密码本身。
  4. 抗碰撞性:
    ◦ 哈希算法设计成使得找到两个不同的输入数据产生相同哈希值(碰撞)非常困难。
    ◦ 理想的哈希算法应该具有高抗碰撞性,即找到碰撞的概率极低。

常见的哈希算法

  1. MD5(Message-Digest Algorithm 5):
    ◦ 输出长度:128位(32个十六进制字符)
    ◦ 特点:速度快,但抗碰撞性较弱,不推荐用于密码学用途。
  2. SHA-1(Secure Hash Algorithm 1):
    ◦ 输出长度:160位(40个十六进制字符)
    ◦ 特点:比MD5更安全,但近年来也发现了一些安全漏洞,逐渐被更安全的算法取代。
  3. SHA-256(Secure Hash Algorithm 256):
    ◦ 输出长度:256位(64个十六进制字符)
    ◦ 特点:安全性高,广泛用于密码学和数据完整性验证。
  4. SHA-3:
    ◦ 输出长度:可变(如SHA3-256输出256位)
    ◦ 特点:最新的哈希算法,设计上更加安全,抗碰撞性强。
    
    

哈希值的应用

  1. 数据完整性验证:
    ◦ 通过计算文件或数据的哈希值,可以验证数据在传输或存储过程中是否被篡改。
    ◦ 例如,下载软件时,可以通过比较哈希值来验证文件的完整性。
  2. 密码存储:
    ◦ 存储用户密码时,通常存储密码的哈希值而不是密码本身,以提高安全性。
    ◦ 例如,使用SHA-256算法对用户密码进行哈希处理后存储。
  3. 哈希表:
    ◦ 哈希表是一种数据结构,通过哈希函数将键映射到表中的位置,实现快速的查找、插入和删除操作。
    ◦ 哈希表的性能依赖于哈希函数的质量和冲突解决机制。
  4. 数字签名:
    ◦ 在数字签名中,哈希值用于生成消息的摘要,然后对摘要进行加密,以验证消息的完整性和发送者的身份。

mbedtls哈希值计算

c 复制代码
#include <stdio.h>
#include <stdlib.h>

#include "mbedtls/md.h"

const unsigned char msg1_part1[] = { 0x31, 0x32 };
const unsigned char msg1_part2[] = { 0x33, 0x34 };

void print_buf(const char* title, unsigned char* buf, size_t len);

int main()
{
    int ret = 0;
    mbedtls_md_context_t ctx;
    unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };

    const mbedtls_md_info_t* info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
    mbedtls_md_init(&ctx);
    mbedtls_md_setup(&ctx, info, 0);
    mbedtls_md_starts(&ctx);
    mbedtls_md_update(&ctx, msg1_part1, sizeof(msg1_part1));
    mbedtls_md_update(&ctx, msg1_part2, sizeof(msg1_part2));
    mbedtls_md_finish(&ctx, out);
    print_buf("msg1", out, mbedtls_md_get_size(info));


exit:
    mbedtls_md_free(&ctx);

    printf("Hello World!\n");

}

void print_buf(const char* title, unsigned char* buf, size_t len)
{
    printf("%s:", title);
    for (size_t i = 0; i < len; i++) {
        printf(" %02x", buf[i]);
    }
    printf("\n");
}
相关推荐
老花眼猫1 小时前
曼陀罗2-曼陀罗图案自由创制App
c语言·经验分享·青少年编程·课程设计
爱读书的小胖2 小时前
Codewars: A Brave New Wordle(C)解题分析
c语言·数据结构·算法
Escalating_xu2 小时前
【数据结构】顺序表的应用:动态通讯录项目与双指针经典算法
c语言·数据结构·算法
从小白到软工3 小时前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
Logic1013 小时前
C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原
c语言·数据结构·字符串·模拟·时间复杂度·空间复杂度·算法题
SuperByteMaster4 小时前
while(1){;} 加分号
c语言
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
星恒随风5 小时前
Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理
linux·c语言·笔记·学习·状态模式
学逆向的5 小时前
C 浮点数e(科学计数法)
c语言·开发语言·网络安全
知识分享小能手5 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法