2017-08-29 2 views
0

J'ai remarqué que quand j'envoyer une URL comme ceci:envoyer hachage SHA256 comme param URL comme signature pour les données de demande Rails

http://localhost:3000/register/register_user/?sig=zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4= 

ce qui vient à travers quand je l'utilise pour comparer au résultat attendu à l'aide params [: sig] dans le contrôleur est ceci:

zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4= 

pour une raison quelconque le signe « + » qui était dans l'url au 9ème caractère de la fin de la chaîne a été convertie en un espace.

Vous ne savez pas pourquoi cela se produit, que cela se produise uniquement avec les signes + ou quoi.

Le résultat renvoyé par Digest :: SHA256.base64digest (data) a ce signe plus pour que ma validation de la signature échoue.

Quelle est la meilleure façon de résoudre ce problème? Sera-t-il suffisant, dans le cas général, de convertir les signes '+' en espaces avant la comparaison ou est-ce que c'est une façon moins laide d'aborder?

Répondre

1

Vous devrez l'encoder en url. Soit faire une recherche et remplacer pour + avec% 2B ou forcer le codage en utilisant open-uri.

require 'cgi' 
sig = "zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=" 
puts CGI.escape(sig) 

Testé cette fois.

irb(main):008:0> require 'cgi' 
=> true 
irb(main):009:0> CGI.escape('zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=') 
=> "zaQ%2F876CwJMEEmrJqAOYHyEKBXy2s03NDmk%2B3FsXPr4%3D" 
irb(main):010:0> 
+0

Cela ne semble pas faire quoi que ce soit. La sortie des puts au-dessus de zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk + 3FsXPr4 = – user1023110

+0

Le signe plus est-il le seul caractère qui peut apparaître dans le hachage calculé? Ou y en a-t-il d'autres qui pourraient être traduits d'une manière ou d'une autre? – user1023110

+0

Le signe égal vous obtiendra aussi – jbrahy