无法从 bouncycastle 和 openssl dgst 获取匹配的 SHA1 摘要

Unable to get matching SHA1 digest from bouncycastle and openssl dgst

我要疯了吗?这是我的 Scala 代码 "org.bouncycastle" % "bcprov-jdk15on" % "1.59"

import java.util.Base64
import java.security.MessageDigest
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.Security
import java.nio.charset.Charset

Security.addProvider(new BouncyCastleProvider)
val sha1 = MessageDigest.getInstance("SHA1", "BC")
val digest = sha1.digest("foo".getBytes(Charset.forName("UTF-8")))

Base64.getEncoder.encodeToString(digest)

这会产生,对于 foo 输入 C+7Hteo/D9vJXQ3UfzxbwnXaijM=

Openssl:

openssl dgst -binary -sha1 <<< "foo" | openssl enc -base64

对于foo输入8dLS+STphqyG/fezbJS83zK+7BU=

MD5 和 SHA256 也是如此 显然有人在做与其他人不同的事情..但是什么?

我在 openssl enc -base64 和 java.util.Base64 之间单独验证了 base64 编码,在 openssl 输出中似乎有一个额外的字符(..),加上 java.util.Base64垫,否则匹配

scala> Base64.getEncoder.encodeToString("foo,bar,etc".getBytes(Charset.forName("UTF-8")))
res6: String = Zm9vLGJhcixldGM=

$ openssl enc -base64 <<< "foo,bar,etc"
Zm9vLGJhcixldGMK

那是因为shell在<<< foo的末尾加了一个换行符,所以openssl看到的字符串不只是"foo",而是"foo\n".

尝试echo -n foo | openssl dgst -binary -sha1 | base64

我必须用多余的答案来回应,因为我带着同样的问题来到这里,而且我的业力小于 15。Dima 是正确的

echo test|openssl dgst -md4
(stdin)= 36d729ab4ff7260da6fb010ef5747bb3

 echo -n test|openssl dgst -md4
(stdin)= db346d691d7acc4dc2625db19f9e3f52

第二个结果也证实了 bouncycastle。在此回复时有一个带有 md4 选项的在线摘要检查器,它也同意第二个结果。