概述
sha-256,英文全称为secure hash algorithm 256-bit,是一种广泛使用的密码散列函数,属于sha-2家族。sha-256算法由美国国家安全局(nsa)设计,并由美国国家标准与技术研究院(nist)于2001年发布。sha-256算法主要用于提供数据完整性校验和安全认证,生成一个固定长度为256位(即32字节)的散列值,通常以64个字符的十六进制字符串形式表示。
sha-256算法主要有以下4个特点。
1、安全性:sha-256设计用于达到至少128位的安全强度,这意味着,找到两个不同的输入产生相同哈希值的难度非常大,理论上需要进行2^128次尝试,这在当前计算能力下是不可行的。
2、不可逆性:sha-256是一种单向散列函数,意味着从散列值很难推算出原始输入数据。
3、确定性:对于相同的输入数据,无论何时何地执行sha-256算法,都将得到完全相同的哈希值。
4、输入敏感性:即使是输入数据的微小改变,也会导致输出哈希值的巨大变化,这称为雪崩效应。
chp_sha256
为了方便使用sha-256算法,我们封装了chp_sha256类。这个类是一个接口类,不需要实例化。因此,我们将构造函数和析构函数声明成了私有的。chp_sha256类的头文件,可参考下面的示例代码。
#pragma once #include "hp_types.h" #define hp_sha256_hash_len 32 class chp_sha256 { public: static int calcsha256(char *pdata, unsigned int uidatalen, unsigned char pucresult[hp_sha256_hash_len]); static int calchmacsha256(char *pkey, unsigned int uikeylen, char *pdata, unsigned int uidatalen, unsigned char pucresult[hp_sha256_hash_len]); private: chp_sha256(); ~chp_sha256(); typedef struct _thpsha256context { hp_u64 ui64len; unsigned int puistate[8]; unsigned int uicurlen; unsigned char pucbuf[64]; } thpsha256context; static void init(thpsha256context *pcontext); static void update(thpsha256context *pcontext, void *pbuf, unsigned int uibuflen); static void final(thpsha256context *pcontext, unsigned char pucresult[hp_sha256_hash_len]); static void transform(thpsha256context *pcontext, unsigned char *pucbuf); static int hash(unsigned char *px, unsigned int uixlen, unsigned char *py, unsigned int uiylen, unsigned char *pout, unsigned int uioutlen); static void sha256(char *pdata, unsigned int uidatalen, unsigned char *presult, unsigned int uiresultlen); };
chp_sha256类的接口比较简单,下面我们逐一介绍。
calcsha256:计算sha256。参数pdata为输入数据buffer,参数uidatalen为输入数据的长度,参数pucresult 为计算结果值,用于传出。返回值为0表示成功,其他为错误码。
calchmacsha256:计算hmac-sha256。参数pkey为密钥buffer,参数uikeylen为密钥的长度,这两个参数与hmac有关。参数pdata为输入数据buffer,参数uidatalen为输入数据的长度,参数pucresult 为计算结果值,用于传出。返回值为0表示成功,其他为错误码。
总结
sha-256算法由于其强大的安全性,已成为国际标准和许多安全协议的推荐算法。在密码存储、数字签名、区块链技术、ssl/tls协议、数据完整性验证、系统安全审计等众多应用领域,sha-256算法都扮演着至关重要的角色,发挥了巨大的作用。