如何使用 SHA1 哈希算法在 C++ 中哈希系统时间?
How to hash system time in c++ using SHA1 hashing algorithm?
我试图用 C++ 散列系统时间。我是这样用chrono库计算系统时间的。
#include<iostream>
#include<chrono>
#include<ctime>
int main()
{
auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
std::cout<<"The time is "<<ctime(&timenow)<<std::endl;
return 0;
}
但是这次我在散列方面遇到了问题。在使用SHA1哈希算法将这个时间转换成唯一的哈希字符串。
我尝试包含库 #include "sha1.h"
和 #include<openssl/sha1.h>
。但是这些都没有用
(已安装 openssl 库)。有人可以帮我找出正确的方法吗?
对于所有可用的安全哈希算法,您可能需要 #include <openssl/sha.h>
。
这将使您能够访问所有这些功能:
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA1(const unsigned char *d, size_t n,
unsigned char *md);
在这种情况下,您可能只需执行 one-shot 调用:
unsigned char result[20] = {};
SHA1(const char*)&timenow, sizeof(timenow), result);
或长途跋涉:
#include <iostream>
#include <iomanip>
#include <openssl/sha.h>
#include <time.h>
#include <stdint.h>
int main() {
// time_t can be 32-bit or 64-bit
// so force timenow to be 64-bit, so we'll have consistent
// hash values across different machine architectures
uint64_t timenow = time(nullptr);
unsigned char result[20]={};
// hash it
SHA_CTX ctx = {};
SHA1_Init(&ctx);
SHA1_Update(&ctx, (const char*)&timenow, sizeof(timenow));
SHA1_Final(result, &ctx);
// print the result
std::cout << "Current unix epoch time is " << timenow << std::endl;
for (auto x = 0; x < 20; x++) {
std::cout << std::hex << std::setfill('0') << std::setw(2) << (unsigned int)(result[x]);
}
std::cout << std::endl;
return 0;
};
不要忘记 link 加密库,-lcrypto
示例编译和运行:
$ g++ source.cpp -lcrypto -o demo
$ ./demo
Current unix epoch time is 1601974311
cc227522246af31e4c9bff9d3f78166f62a19695
$ ./demo
Current unix epoch time is 1601974314
15d03343855d674330cbfc5dc435cc3d320e2788
另外,你到底想做什么? time_t 时间戳的散列本身不是很有趣或安全。鉴于自 1970 年 1 月 1 日以来只有大约 10 亿秒,它可以被简单地逆转。
我试图用 C++ 散列系统时间。我是这样用chrono库计算系统时间的。
#include<iostream>
#include<chrono>
#include<ctime>
int main()
{
auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
std::cout<<"The time is "<<ctime(&timenow)<<std::endl;
return 0;
}
但是这次我在散列方面遇到了问题。在使用SHA1哈希算法将这个时间转换成唯一的哈希字符串。
我尝试包含库 #include "sha1.h"
和 #include<openssl/sha1.h>
。但是这些都没有用
(已安装 openssl 库)。有人可以帮我找出正确的方法吗?
对于所有可用的安全哈希算法,您可能需要 #include <openssl/sha.h>
。
这将使您能够访问所有这些功能:
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA1(const unsigned char *d, size_t n,
unsigned char *md);
在这种情况下,您可能只需执行 one-shot 调用:
unsigned char result[20] = {};
SHA1(const char*)&timenow, sizeof(timenow), result);
或长途跋涉:
#include <iostream>
#include <iomanip>
#include <openssl/sha.h>
#include <time.h>
#include <stdint.h>
int main() {
// time_t can be 32-bit or 64-bit
// so force timenow to be 64-bit, so we'll have consistent
// hash values across different machine architectures
uint64_t timenow = time(nullptr);
unsigned char result[20]={};
// hash it
SHA_CTX ctx = {};
SHA1_Init(&ctx);
SHA1_Update(&ctx, (const char*)&timenow, sizeof(timenow));
SHA1_Final(result, &ctx);
// print the result
std::cout << "Current unix epoch time is " << timenow << std::endl;
for (auto x = 0; x < 20; x++) {
std::cout << std::hex << std::setfill('0') << std::setw(2) << (unsigned int)(result[x]);
}
std::cout << std::endl;
return 0;
};
不要忘记 link 加密库,-lcrypto
示例编译和运行:
$ g++ source.cpp -lcrypto -o demo
$ ./demo
Current unix epoch time is 1601974311
cc227522246af31e4c9bff9d3f78166f62a19695
$ ./demo
Current unix epoch time is 1601974314
15d03343855d674330cbfc5dc435cc3d320e2788
另外,你到底想做什么? time_t 时间戳的散列本身不是很有趣或安全。鉴于自 1970 年 1 月 1 日以来只有大约 10 亿秒,它可以被简单地逆转。