使用 SHA-1 和 base64 编码的哈希字符串

Hash string using SHA-1 and base64 encode

如何使用 SHA-1base64 编码对字符串进行哈希处理?我有 openssl 包,我可以使用 sha1 函数得到一个字符串,但我不知道如何将 sha-1base64 编码组合到我的字符串中。

出于测试目的,我的字符串是:

HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123

我需要 SHA-1 和 base64 编码输出:

nuoiyUX6m+irC5rvB4QUSycfHGc=

请哪位好心人指点一下?

当你使用openssl包时,使用下面的函数

openssl::base64_encode(openssl::sha1(charToRaw("HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123")))

openssl一般操作的是文件,基本上是字节流中的stdin。

我正在以 printf 的形式传递 "HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123",在一个非 0 字节序列中(它可能会或可能不会形成 UTF-8 或其他字符 set/encoding 中的有效字符)。

由于输入是从终端通过键盘传递的。终端将发送以其配置的字符集编码的相应字符(如键标签上所写)。

通常,在当前语言环境中设置。您可以使用命令 "locale charmap".

找到它

我们必须确保输入首先转换为 UTF-8,然后传递给 openssl。这就是我使用 icovn 将字节转换为 UTF-8 中相应编码的原因。

因此可以使用以下命令将我们的字符串转换为 sha1,然后使用 openssl 转换为 base64。

printf %s "HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123" |  iconv -t utf-8 | openssl dgst -sha1 -binary | openssl enc -base64
$ echo nuoiyUX6m+irC5rvB4QUSycfHGc= | base64 -d | xxd -g 1
00000000: 9e ea 22 c9 45 fa 9b e8 ab 0b 9a ef 07 84 14 4b  ..".E..........K
00000010: 27 1f 1c 67 

并且:

$ echo -n "HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123" | openssl sha1 
(stdin)= 9eea22c945fa9be8ab0b9aef0784144b271f1c67

并且:

$ cat test.c 
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main()
{
    unsigned char ibuf[] = "HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123";
    unsigned char obuf[20];

    SHA1(ibuf, strlen(ibuf), obuf);

    int i;
    for (i = 0; i < 20; i++) {
        printf("%02x ", obuf[i]);
    }
    printf("\n");

    return 0;
}

然后:

$ gcc -I /usr/local/include/ test.c /usr/local/lib/libcrypto.a -o test.exe
$ ./test.exe 
9e ea 22 c9 45 fa 9b e8 ab 0b 9a ef 07 84 14 4b 27 1f 1c 67 

可能有点晚了,但试试看

$ echo -n "HY8&V5EDJO8NYT9C2011-12-13T00:44:02ZTest123" | openssl dgst -binary -sha1 | openssl enc -base64

这将:

  1. 将字符串回显到管道
  2. openssl 将使用 SHA1 算法消化字符串并通过管道传输
  3. openssl 将使用 base64 算法将步骤 2 中生成的摘要字符串编码为新字符串

它会回显给你。