使用 SHA-1 和 base64 编码的哈希字符串
Hash string using SHA-1 and base64 encode
如何使用 SHA-1
和 base64
编码对字符串进行哈希处理?我有 openssl 包,我可以使用 sha1
函数得到一个字符串,但我不知道如何将 sha-1
和 base64
编码组合到我的字符串中。
出于测试目的,我的字符串是:
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
这将:
- 将字符串回显到管道
- openssl 将使用 SHA1 算法消化字符串并通过管道传输
- openssl 将使用 base64 算法将步骤 2 中生成的摘要字符串编码为新字符串
它会回显给你。
如何使用 SHA-1
和 base64
编码对字符串进行哈希处理?我有 openssl 包,我可以使用 sha1
函数得到一个字符串,但我不知道如何将 sha-1
和 base64
编码组合到我的字符串中。
出于测试目的,我的字符串是:
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
这将:
- 将字符串回显到管道
- openssl 将使用 SHA1 算法消化字符串并通过管道传输
- openssl 将使用 base64 算法将步骤 2 中生成的摘要字符串编码为新字符串
它会回显给你。