如何在 Scala 中为字符串正确生成 SHA-256 校验和?
How to correctly generate SHA-256 checksum for a string in scala?
我需要从将作为 get 参数发送的字符串生成 SHA-256 校验和。
如果找到this link生成校验和。
像这样生成校验和:
val digest = MessageDigest.getInstance("SHA-256");
private def getCheckSum() = {
println(new String(digest.digest(("Some String").getBytes(StandardCharsets.UTF_8))))
}
打印类似于此的校验和:
*║┼¼┬]9AòdJb:#↓o6↓T╞B5C♀¼O~╟╙àÿG
我们需要将其发送至的 API 表示校验和应如下所示:
45e00158bc8454049b7208e76670466d49a5dfb2db4196
我做错了什么?
请指教。
谢谢
java.security.MessageDigest#digest
给出一个字节数组。
scala> import java.security.MessageDigest
scala> import java.math.BigInteger
scala> MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))
res1: Array[Byte] = Array(97, -48, 52, 71, 49, 2, -41, -38, -61, 5, -112, 39, 112, 71, 31, -43, 15, 76, 91, 38, -10, -125, 26, 86, -35, -112, -75, 24, 75, 60, 48, -4)
要创建十六进制,请使用 String.format
、
scala> val hash = String.format("%032x", new BigInteger(1, MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))))
hash: String = 61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc
您可以在 linux、unix
中使用命令行工具验证哈希
$ echo -n "some string" | openssl dgst -sha256
61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc
注意:
如果 java returns 散列长度小于 64 个字符,您可以使用 0
进行填充。 (例如 39
)
def hash64(data: String) = {
val hash = String.format(
"%032x",
new BigInteger(1, MessageDigest.getInstance("SHA-256").digest(data.getBytes("UTF-8")))
)
val hash64 = hash.reverse.padTo(64, "0").reverse.mkString
hash64
}
等效,但效率更高:
MessageDigest.getInstance("SHA-256")
.digest("some string".getBytes("UTF-8"))
.map("%02x".format(_)).mkString
可以使用DatatypeConverter.printHexBinary
.
类似于:
DatatypeConverter.printHexBinary(
MessageDigest
.getInstance(algorithm)
.digest("some string").getBytes("UTF-8")))
我需要从将作为 get 参数发送的字符串生成 SHA-256 校验和。
如果找到this link生成校验和。
像这样生成校验和:
val digest = MessageDigest.getInstance("SHA-256");
private def getCheckSum() = {
println(new String(digest.digest(("Some String").getBytes(StandardCharsets.UTF_8))))
}
打印类似于此的校验和:
*║┼¼┬]9AòdJb:#↓o6↓T╞B5C♀¼O~╟╙àÿG
我们需要将其发送至的 API 表示校验和应如下所示:
45e00158bc8454049b7208e76670466d49a5dfb2db4196
我做错了什么?
请指教。 谢谢
java.security.MessageDigest#digest
给出一个字节数组。
scala> import java.security.MessageDigest
scala> import java.math.BigInteger
scala> MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))
res1: Array[Byte] = Array(97, -48, 52, 71, 49, 2, -41, -38, -61, 5, -112, 39, 112, 71, 31, -43, 15, 76, 91, 38, -10, -125, 26, 86, -35, -112, -75, 24, 75, 60, 48, -4)
要创建十六进制,请使用 String.format
、
scala> val hash = String.format("%032x", new BigInteger(1, MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))))
hash: String = 61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc
您可以在 linux、unix
中使用命令行工具验证哈希$ echo -n "some string" | openssl dgst -sha256
61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc
注意:
如果 java returns 散列长度小于 64 个字符,您可以使用 0
进行填充。 (例如 39
)
def hash64(data: String) = {
val hash = String.format(
"%032x",
new BigInteger(1, MessageDigest.getInstance("SHA-256").digest(data.getBytes("UTF-8")))
)
val hash64 = hash.reverse.padTo(64, "0").reverse.mkString
hash64
}
等效,但效率更高:
MessageDigest.getInstance("SHA-256")
.digest("some string".getBytes("UTF-8"))
.map("%02x".format(_)).mkString
可以使用DatatypeConverter.printHexBinary
.
类似于:
DatatypeConverter.printHexBinary(
MessageDigest
.getInstance(algorithm)
.digest("some string").getBytes("UTF-8")))