Openssl
Openssl 是一个开源的代码库,包括 SSL 协议库,应用程序和密码算法库,主要适用于 C/C++开发,内置许多加密算法。
安装 Openssl 库
Ubuntu 18.04 内置了 1.1.0 版本的 Openssl,可以使用openssl version
查看版本。也可以像其他软件一样更新之,sudo apt install opensll
但是以上的 Openssl 只能用于终端,并不能用于编程,需要安装 Openssl 的开发环境:
sudo apt install libssl-dev
- 相关头文件被安装
/usr/include/openssl
中,也可以软链接到/usr/local/include
中,相关库文件默认安装在/usr/lib/x86_64-linux-gnu/
中。
使用 Openssl 库
一般使用 Openssl 是使用其中的密码算法,它的密码算法都必须链接libcrypto.so
链接库;如果使用的是ssl
协议,则需要链接libssl.so
链接库。
编译命令为g++ demo.cpp -lcrypto
#include <openssl/sha.h>
#include <openssl/md5.h>
/**
* md5算法,对data进行认证处理
* 输入:data,待md5的数据
* 输出:128位字符的散列值,为方便处理,输出时转换为了十六进制的string
*/
std::string get_md5(const std::string &data)
{
unsigned char *result = new unsigned char[20];
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, data.c_str(), data.size());
MD5_Final(result, &ctx);
char *buf = new char[32];
for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
{
sprintf((char *)&buf[i * 2], "%02x", result[i]);
}
return std::string(buf, MD5_DIGEST_LENGTH * 2);
}
/**
* sha256算法
*/
string sha256(const string str)
{
char buf[10];
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
string NewString = "";
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(buf, "%02x", hash[i]);
NewString = NewString + buf;
}
return NewString;
}
/**
* hmac_sha256算法,利用key对data进行加密认证处理
* 输入:data,待sha256的数据;key,mac的密钥
* 输出:256位加密字符,为方便处理,输出时转换为了string
*/
std::string get_hmac_sha256(const std::string &data, const std::string &key)
{
unsigned char *result = new unsigned char[40];
unsigned int result_len = 0;
HMAC_CTX *ctx = HMAC_CTX_new();
HMAC_Init_ex(ctx, key.c_str(), key.size(), EVP_sha256(), NULL);
HMAC_Update(ctx, (unsigned char *)data.c_str(), data.size());
HMAC_Final(ctx, result, &result_len);
HMAC_CTX_free(ctx);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 不可以return string(result),string的构造函数不接受unsigned char *
// 不可以直接 return (char *)result
// 因为result后面还有空余字符,加密的值要严格控制在result_len的长度范围内
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return std::string((char *)result, result_len);
}