如何计算windows批处理编码的sha1 base64?

时间:2015-11-13 12:37:13

标签: windows perl batch-file openssl command

我试图在Windows批处理文件中获取base64编码的sha1哈希。 我尝试的第一件事就是使用perl:

perl -M"Digest::SHA1 qw(sha1_base64)" -e "open(F,shift) or die; binmode F; print sha1_base64(<F>), qq(=\n)" "test.mxf"

这很好用,但仅适用于小文件。对于大文件,它说“内存不足”。

然后我下载了一个用于Windows的openssl版本并尝试了这个:

"C:\openssl.exe" dgst -sha1 -binary -out "hash_sha1.txt" "C:\test.mxf"
set /p hash_sha1=<"hash_sha1.txt"
del "hash_sha1.txt"
echo !hash_sha1!

echo -n '!hash_sha1!' | "C:\openssl.exe" enc -base64

但是openssl方法的输出与Perl输出不同,我知道Perl方法产生正确的输出。我需要改变什么?

2 个答案:

答案 0 :(得分:4)

  • -n没有echo参数,因此-n和单引号是输出的一部分。
  • 不需要中间文件和变量,请使用管道。

整个代码:

openssl dgst -sha1 -binary "C:\test.mxf" | openssl enc -base64

答案 1 :(得分:2)

如果您创建Digest::SHA1对象,则可以使用add方法逐步计算哈希值

也无需显式打开作为命令行参数传递的文件。它们使用内置文件句柄ARGV自动打开,可以使用empoty菱形运算符<>

读取
perl -Mopen=IN,:raw -MDigest::SHA1 -e"$d=Digest::SHA1->new; $d->add($_) while <>; print $d->b64digest, qq{=\n}" 5GB.bin

这个命令行非常乐意生成一个5GB文件的SHA1哈希值,但如果你不幸的是有一个不包含换行符的非常大的文件,那么你将不得不设置一个读取块大小

local $/ = \(1024*1024)