如何使用 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 亿秒,它可以被简单地逆转。