如何在scala中为字符串正确生成SHA-256校验和?

时间:2017-09-20 19:05:56

标签: scala sha

我需要从一个字符串生成一个SHA-256校验和,该字符串将作为 get 参数发送。

如果找到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

我做错了什么?

请指教。 感谢。

3 个答案:

答案 0 :(得分:11)

等效,但效率更高:

MessageDigest.getInstance("SHA-256")
  .digest("some string".getBytes("UTF-8"))
  .map("%02x".format(_)).mkString

答案 1 :(得分:4)

.digest提供一个字节数组。

scala> import java.security.MessageDigest
import java.security.MessageDigest

scala> import java.math.BigInteger
import java.math.BigInteger

scala> MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))
res6: 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> String.format("%032x", new BigInteger(1, MessageDigest.getInstance("SHA-256").digest("some string".getBytes("UTF-8"))))
res4: String = 61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc

您可以使用linux中的命令行工具验证哈希,unix

$ echo -n "some string" | openssl dgst -sha256
61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc

答案 2 :(得分:0)

可以使用DatatypeConverter.printHexBinary

类似的东西:

DatatypeConverter.printHexBinary(
  MessageDigest
    .getInstance(algorithm)
    .digest("some string").getBytes("UTF-8")))