概述
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算法都扮演着至关重要的角色,发挥了巨大的作用。