2017-09-20 5 views
1

J'ai besoin de générer une somme de contrôle SHA-256 à partir d'une chaîne qui sera envoyée en tant que get param.Comment générer correctement une somme de contrôle SHA-256 pour une chaîne dans scala?

S'il est trouvé this link pour générer la somme de contrôle.

générent la somme de contrôle comme ceci:

val digest = MessageDigest.getInstance("SHA-256");  
    private def getCheckSum() = { 
    println(new String(digest.digest(("Some String").getBytes(StandardCharsets.UTF_8))))   
    } 
contrôle imprime

semblable à ceci:

*║┼¼┬]9AòdJb:#↓o6↓T╞B5C♀¼O~╟╙àÿG 

L'API que nous devons envoyer à dit la somme de contrôle devrait ressembler à ceci:

45e00158bc8454049b7208e76670466d49a5dfb2db4196 

Qu'est-ce que je fais mal?

Veuillez nous aviser. Merci.

+0

Elle renvoie un message digest octets bruts. Vous format attendu, elles doivent être codées comme hex – puhlen

Répondre

0

.digest donne un tableau d'octets.

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) 

Pour créer l'hexagone, utilisez String.format,

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

Vous pouvez vérifier hachage avec unix

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

Petit bug ici, la représentation de chaîne est manquant les 0., par exemple la chaîne '39' retournera' b918943df0962bc7a1824c0555a389347b4febdc7cf9d1254406d80ce44e3f9' au lieu de '0b918943df0962bc7a1824c0555a389347b4febdc7cf9d1254406d80ce44e3f9' – Gustek

4

équivalent, outil de ligne de commande sous Linux, mais un peu plus efficace:

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

code Hash généré en utilisant votre doesnt mehtod semble être équivalent à ce qui est généré en utilisant la méthode de réponse précédente: https://imgur.com/a/a3Gfv –

+0

Ouais, désolé. Fixé maintenant – Dima