[R] Calcul SHA1 - Authentification

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
phidyos
Niveau 1
Niveau 1
Messages : 8
Enregistré le : ven. 09 oct. 2009 16:32
Status : Hors ligne

[R] Calcul SHA1 - Authentification

#1

Message par phidyos »

Bonjour.
Je souhaite m'authentifier sur un site.
Je ne souhaite pas utiliser ie.au3 (cela fonctionne par cette méthode mais elle est très gourmande en mémoire et processus puisque cela lance internet explorer).

La méthode d'authentification est la suivante:
-Récupération d'un nonce à partir d'une première requête
-Calcul du token selon la formule donnée par le site:
Implementation Notes

Use this algorithm to calculate the token from nonce and password:

Code : Tout sélectionner

token = SHA1(nonce + SHA1(password))
where SHA1 has hex encoded output like sha1sum command

This linux command line sample works:

Code : Tout sélectionner

sha=`echo -n "$password" | sha1sum | awk '{print $1}'`
token=`echo -n "$nonce$sha" | sha1sum | awk '{print $1}'`
A nonce CAN NOT be reused. The nonce returned by last /user operation MUST be used for calculating the token.
-Envoi d'une requete d'authentification contenant le token et le username

J'utilise un UDF SHA1.au3 obtenu à cette adresse: http://www.autoitscript.com/forum/topic ... e-version/

Voici mon code:

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <sha1.au3>

$username="******.*******%40gmail.com"
$password="************"

;Récupération de la page d'init
$array=_StringBetween(BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init"),4),'"','"')

;Récupération de "nonce" en le convertissant en hexa
$nonce=StringTrimLeft(StringToBinary($array[4]),2)

;Calcul du sha
$sha = _SHA1($password)

;Calcul du token
$token= StringTrimLeft(_SHA1($nonce&$sha),2)

;Envoi de la requete contenant le username et le token
$result=BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token),4)
ConsoleWrite("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token&@cr&$result)

 
Biensur, à chaque fois, j'obtiens un joli {"success":false,"error":"authentication error",......}.
Est-ce que je fais une erreur bête quelque part?
Je pense que c'est la retranscription de la formule à appliquer qui est mauvaise mais je ne vois pas comment faire...
Merci d'avance pour votre aide !
Modifié en dernier par phidyos le lun. 13 janv. 2014 18:56, modifié 1 fois.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#2

Message par jchd »

_SHA1 renvoie un binaire. Si cette valeur est par la suite convertie en chaîne pour concaténation avec le nonce, alors ... :wink:
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
phidyos
Niveau 1
Niveau 1
Messages : 8
Enregistré le : ven. 09 oct. 2009 16:32
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#3

Message par phidyos »

J'ai modifié le script en fonction de votre conseil mais cela ne donne rien...
Je dois passer à côté de quelque chose....

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <sha1.au3>

$username="****.******%40gmail.com"
$password="***********"

;Récupération de la page d'init
$array=_StringBetween(BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init")),'"','"')

;Récupération de "nonce"
$nonce=$array[4]
ConsoleWrite("Nonce: "&$nonce&@CR)

;Calcul du sha
$sha = BinaryToString(_SHA1($password))
ConsoleWrite("Sha: "&$sha&@CR)

;Calcul du token
$token= StringTrimLeft(_SHA1($nonce&$sha),2)
ConsoleWrite("Token: "&$token&@CR)

;Envoi de la requete contenant le username et le token
$result=BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token),4)
ConsoleWrite("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token&@cr&$result)
 
Je récupère le nonce (chaine de caractères).
Je calcule le SHA1 du password que je convertit en chaine de caractères.
Je calcule le SHA1 de la concaténation du nonce et du sha pour obtenir le token...
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#4

Message par jguinch »

A priori, la valeur de $nonce correspond à "jsessionid".
Le problème ne vient-il pas de là ?

Code : Tout sélectionner

$nonce = StringRegExpReplace( BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init")) , '(?s).*"nonce"\h:\h"([^"]+).*', "$1")
 
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
phidyos
Niveau 1
Niveau 1
Messages : 8
Enregistré le : ven. 09 oct. 2009 16:32
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#5

Message par phidyos »

Merci pour cette réponse. Je pense que le problème se situe effectivement du côté du JSESSIONID.
Voici ce que je viens de trouver à propos de l'API du site auquel je veux me connecter:
'/user/login' also needs JSESSIONID.

It's not problem when calling from browser because it is automatically sent in cookies.

You would need to set some curl options to send cookies with JSESSIONID.

All other request will also need valid (authenticated) JSESSIONID.
Sinon, pour vous, est-ce que ma méthode de calcul du token vous parait correcte?
Merci encore...
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#6

Message par jchd »

Essaye quand même ceci :
► Afficher le texte
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
phidyos
Niveau 1
Niveau 1
Messages : 8
Enregistré le : ven. 09 oct. 2009 16:32
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#7

Message par phidyos »

Merci beaucoup pour l'aide mais cela ne fonctionne pas.
Je pense qu'il faut gérer la transmission du jsessionid par cookie.
J'ai trouvé ce lien:

http://brugbart.com/setting-http-request-headers-autoit

On verra bien si j'arrive à quelque chose...
phidyos
Niveau 1
Niveau 1
Messages : 8
Enregistré le : ven. 09 oct. 2009 16:32
Status : Hors ligne

Re: [..] Calcul SHA1 - Authentification

#8

Message par phidyos »

Bon, après avoir galéré quelques heures à apprendre le fonctionnement des cookies et de winhttp, j'ai enfin réussi...
Il y avait plusieurs problèmes:

1/Il fallait bien envoyer un header contenant le cookie avec le jsessionid
2/il fallait respecter la casse dans la formule du SHA1 ! Donc un stringlower() sur le calcul de $sha et tout était réglé!

Voici le script final fonctionnel:

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <Crypt.au3>

$username = "******.*******%40gmail.com"
$password = "*********"

;Requête d'initialisation d'authentification
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://my.zipato.com:443/zipato-web/rest/user/init", False)
$oHTTP.Send()

;Récupérer le cookie
$array_cookie=GetCookies($oHTTP)
$string_cookie_jsessionid=$array_cookie[0]
ConsoleWrite($string_cookie_jsessionid&@CR)

;Récupération du contenu de la page d'init
$reponse=$oHTTP.ResponseText()
$array = _StringBetween($reponse, '"', '"')

;Récupération du jsessionid
$jsessionid=$array[2]
ConsoleWrite("jsessionid : "&$jsessionid&@CR)

;Récupération du nonce
$nonce=$array[4]
ConsoleWrite("Nonce : "&$nonce&@CR)

;Calcul du sha
$sha = stringlower(stringtrimleft(_Crypt_HashData($password, $CALG_SHA1),2))
ConsoleWrite("Sha: " & $sha & @CR)

;Calcul du token
$token = StringLower(StringTrimLeft(_Crypt_HashData($nonce&$sha, $CALG_SHA1), 2))
ConsoleWrite("Token: " & $token & @CR)

;Création de l'URL d'authentification
$url_auth="https://my.zipato.com:443/zipato-web/rest/user/login?username=" & $username & "&token=" & $token

;Envoi de la requête d'authentification avec le cookie en header
$oHTTP=ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", $url_auth, False)
$oHTTP.setRequestHeader("Cookie",$string_cookie_jsessionid)
$oHTTP.Send()
$reponse=$oHTTP.ResponseText()
ConsoleWrite($reponse&@CR)

;***Func GetCookies() Retourne un $array contenant les cookies
Func GetCookies($objet_HTTP)
    ;Récupérer le header
    Local $HeaderResponses = $objet_HTTP.GetAllResponseHeaders()
    ;Récupérer les lignes de cookies
    Local $array = StringRegExp($HeaderResponses, 'Set-Cookie: (.+)\r\n', 3)
    Return($array)
EndFunc
 
Merci encore de m'avoir aiguillé !
Répondre