Firma un URL di richiamata

3

Ho un sistema Single Sign-On che funziona in questo modo:

L'utente fa clic sul link su clientsite.com che lo reindirizza a

mastersite.com?returnTo=http://clientsite.com

Se auth è valido, l'utente viene reindirizzato a:

http://clientsite.com?token=xxxx

Poiché non voglio che http://clientsite.com sia tra una lista di siti Web autorizzati ho deciso di fare quanto segue:

Tutti i clientite condividono una chiave casuale segreta comune come

client_token = "VDFdzbZ3qFvWyx5dUMdEDmwnS7T"

e fai quanto segue:

time = time();    
hash = hash_sha256(client_token + time + http://clientsite.com)
redirecto to : mastersite.com?returnTo=http://clientsite.com&time=time&key=hash

il sito principale quindi controlla:

is time < time() - 10min ?
is hash_sha256(client_token + time + http://clientsite.com) == hash ?

Questo schema è abbastanza sicuro?

L'unico problema che vedo è se decido di cambiare il client_key Ho bisogno di aggiornare molti siti web, posso superare questo?

    
posta IggY 29.12.2015 - 16:35
fonte

2 risposte

5

hash_sha256(client_token + time + http://clientsite.com) == hash

Sembra che sia vulnerabile all'attacco lunghezza-estensione . Probabilmente vorrai utilizzare HMAC anziché un semplice hashing con sha256; oppure utilizzare una funzione di hashing che non è vulnerabile all'attacco dell'estensione di lunghezza.

    
risposta data 29.12.2015 - 17:06
fonte
2

Inoltre, ci sono alcuni protocolli che fanno essenzialmente esattamente quello che stai facendo qui, CAS è quello che mi viene in mente e come ho risolto questa particolare necessità. È costruito appositamente per questo caso d'uso. l'implementazione di riferimento di CAS è costruita in Java, il che è un po 'fastidioso, ma ci sono altre implementazioni là fuori e scrivere il tuo non è poi così difficile. Il vantaggio di usare un protocollo come CAS è che per lo più devi spingere "il protocollo è sicuro" ai progettisti del protocollo.

    
risposta data 03.01.2016 - 04:46
fonte

Leggi altre domande sui tag