web-dev-qa-db-ja.com

Scalaで文字列のSHA-256チェックサムを正しく生成する方法は?

getパラメータとして送信される文字列からSHA-256チェックサムを生成する必要があります。

見つかった場合 このリンク チェックサムを生成します。

次のようにチェックサムを生成する:

  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

何が悪いのですか?

お知らせ下さい。ありがとう。

9
An Illusion

.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)

16進数を作成するには、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
6
prayagupd

同等ですが、少し効率的です:

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

使える DatatypeConverter.printHexBinary

何かのようなもの:

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