#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>
using namespace std;
int main()
{
std::stringstream ss;
std::string data;
data = "hello worl";
unsigned char digest[SHA_DIGEST_LENGTH];
char *string1 = strdup(data.c_str());
// do stuff with string1
free(string1);
SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
char mdString[SHA_DIGEST_LENGTH*2+1];
for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
ss.str("");
ss << mdString;
cout << ss.str() << std::endl;
return 0;
}
我的输出总是一样..
./sha
da39a3ee5e6b4b0d3255bfef95601890afd80709
即使我将数据内容更改为“hello panda”或“hello ki”也会给我相同的输出。
更新: 我拿走了免费的
user1@ubuntu:~/yes/coding$ g++ -o sha sha.cpp -lcrypto
user1@ubuntu:~/yes/coding$ ./sha
1bc8b06c5cd4e774195293ea00c959173d8d3789
user1@ubuntu:~/yes/coding$ ./sha
c8cf70c522fc564aedb5894a24613542702172ca
user1@ubuntu:~/yes/coding$ ./sha
83fbda098c3549ab1347d6cf708ac85092200423
user1@ubuntu:~/yes/coding$ ./sha
ea6ccffd78236e22da412ed90a852329f59f8fd5
user1@ubuntu:~/yes/coding$ ./sha
0413799befebcb23f5a5c970e48febc7f1aa27fb
user1@ubuntu:~/yes/coding$ ./sha
7bd8e7952c78e282b8c117f8c537c456b66207d9
每次都会改变,即使我没有改变数据的内容
答案 0 :(得分:6)
char *string1 = strdup(data.c_str());
// do stuff with string1
free(string1);
SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
你的错误。
不要释放你仍然需要使用的东西。
除此之外:
SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
您在此处所做的是将char* string1
的地址转换为unsigned char*
。您要做的是通过string1
而不是&string1
。这同样适用于digest
。
答案 1 :(得分:1)
将字符串1的地址传递给SHA1函数时,您将获取该地址。但是,string1的类型为const char *。所以只需删除&amp;。
答案 2 :(得分:1)
这部分代码存在问题:
free(string1);
SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
您在free
上致电string1
,然后再次使用string1
,这是未定义的行为。只有在使用free
完成后才需要致电string1
。第二个问题在这里:
SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
^^^^^^^^^^^^^^^^^^^^^^^^
string1
已经char *
取&
string1
地址给你一个char **
。我还不清楚,当您需要char *
时使用unsigned chat *
是可以的,因为char
可以是signed
或unsigned
。