我一直在努力让sha1()函数从openssl / sha.h运行但是我得到随机输出和一些警告。我已经阅读了很多并尝试了一些示例代码,但是我收到了所有代码的警告,并且无法正确显示。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <openssl/sha.h>
int main()
{
const unsigned char data[] = "Hello, World";
unsigned long length = sizeof(data);
unsigned char hash[SHA_DIGEST_LENGTH];
SHA1(data, length, hash);
printf("%02x \n", hash);
return 0;
}
以下是我收到的警告:
sha.c: In function ‘main’:
sha.c:12: warning: ‘SHA1’ is deprecated (declared at /usr/include/openssl/sha.h:124)
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’
当我运行它并获得输出时: 62652b34
任何帮助都会很棒!
答案 0 :(得分:2)
在我想出这一切之前,我还花了一段时间。最好的方法是使用EVP,它为几乎所有东西提供通用功能。
#include <openssl/evp.h>
在调用哈希函数之前,你需要调用这个im main。初始化哈希值。否则openssl会抱怨该算法不可用。
OpenSSL_add_all_algorithms();
模式必须为“SHA256”,“SHA512”,“SHA1”为字符串。 dataToHash 是输入, dataSize 是输入的大小, 应该已经分配 outHashed ,哈希将写在那里
unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) {
unsigned int md_len = -1;
const EVP_MD *md = EVP_get_digestbyname(mode);
if(NULL != md) {
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, dataToHash, dataSize);
EVP_DigestFinal_ex(&mdctx, outHashed, &md_len);
EVP_MD_CTX_cleanup(&mdctx);
}
return md_len;
}
一个用例(这个没有经过测试,我在c ++包装器中使用了上面的代码)
const char *inData = "test data2";
unsigned char outHash[20]; // output is already allocated
hash("SHA1", inData, 10, outHash);
您不应该直接使用SHA1方法,不推荐使用它(您的代码可能会破坏下一版本)。 如果要使用您的版本,则需要将每个字符打印为十六进制:
int i;
for(i=0; i<SHA_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
答案 1 :(得分:1)
您不能以这种方式转储整个缓冲区。你需要循环它,如下所示。您输出的值实际上是hash
缓冲区的地址,这显然不是您要查找的内容。您希望缓冲区中的十六进制字节转储为文本
因此...
int main()
{
const unsigned char data[] = "Hello, World";
unsigned long length = sizeof(data);
unsigned char hash[SHA_DIGEST_LENGTH];
SHA1(data, length, hash);
int i=0;
for (;i< sizeof(hash)/sizeof(hash[0]);++i)
printf("%02x \n", hash[i]);
return 0;
}
关于您的警告,弃用是因为此接口已过时,无法执行您正在尝试的加密操作(SHA1)。 OpenSSL中有更新的接口是最新的。具体考虑EVP接口。
答案 2 :(得分:0)
printf("%02u \n", hash);
通过打印unsigned char
删除警告