mariadb Google BigQury SHA512函数输出与OpenSSL的区别

mepcadol  于 2023-10-20  发布在  Go
关注(0)|答案(3)|浏览(154)

一个hash不是一个意见,为什么Google BigQuery sha 512函数输出与OpenSSL不一致?

  • *SELECT SHA 512(“Hello World”)的Google BigQuery输出;**LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==
    SELECT SHA2(“Hello World”,512);echo -n“Hello World”的OpenSSL输出|sha 512 sum两者都产生:2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

即使是base64的输出也与BigQuery的有很大的不同:SELECT TO_BASE64(SHA2(“Hello World”,512));MmM3NGZkMTdlZGFmZDgwZTg0NDdiMGQ0Njc0MWVlMjQzYjdlYjc0ZGQyMTQ5YTBhYjFiOTI0NmZi MzAzODJmMjdlODUzZDg1ODU3MTllMGU2N2NiZGEwZGFhOGY1MTY3MTA2NDYxNWQ2NDVhZTI3YWNi MTViZmIxNDQ3ZjQ1OWI=

agyaoht7

agyaoht71#

添加一些额外的细节@Georg Richter和@Simon Goater回答:
根据google cloud文档,SHA 512()使用SHA-512算法计算输入的哈希值,输出返回为64 bytes。根据我的理解,输出之间的差异是由于返回类型的格式。如果您的要求是为bigquery和echo命令获取相同的哈希值。你可以考虑使用下面的echo命令:
echo -n "Hello World" | sha512sum | xxd -r -p | base64

示例:
BigQuery结果:

谷歌云 shell :

dy1byipe

dy1byipe2#

你的Google BigQuery输出是base64编码的二进制哈希,而不是base64编码的十六进制哈希。一个简单的PHP脚本显示了BigQuery的来源。

$string = "Hello World";
  $hashstring = hash("sha512", $string, false);
  echo $hashstring."\n";
  echo base64_encode(hex2bin($hashstring))."\n";

输出量:

2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b
LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==
du7egjpx

du7egjpx3#

sha512sum不是OpenSSL;它是一个独立实用程序,通常是GNU coreutils的一部分。
如果你想使用(或比较)OpenSSL:

# to get hash in hex (matches your MariaDB except for the trailing hyphen, or sha512sum) 
echo -n Hello World | openssl sha512

# to get hash in base64 (matches your BigQuery) either of
echo -n Hello World | openssl sha512 -binary | base64 -w0
echo -n Hello World | openssl sha512 -binary | openssl base64 -A

还要注意的是,echo -n不能在Windows上工作,也不能在Unix或Unix shell的一些现在已经过时的版本上工作,而在一些Unix或shell上,echo会修改包含一个或多个反斜杠的值(这当然会破坏你的哈希); printf %s 'Hello World'保证在任何POSIX上都能正常工作。在Windows CMD上,您可以 * 执行set /p="Hello World" <NUL | ...--但我们不要去那里。

相关问题