|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
[JAVA] Autenticazione CRAM MD5
Salve a tutti.
Mi e' venuto in mente di usare qualcosa di meglio del semplice invio password, quindi volevo implementare un'autenticazione di tipo cram, esempio: http://en.wikipedia.org/wiki/CRAM-MD5 Quindi il server invia una stringa (casuale?) al client, il quale risponde calcolando l'ambaradan e ritornando l'md5 (o sha...). Ho scoperto che molte delle cose sono gia' fatte in java, vedi ad esempio http://www.exampledepot.com/egs/java...to/GenMac.html Il problema e' che l'esempio calcola l'hash usando un oggetto Key, mentre da quello che ho capito io dovrei usare la password (una stringa) come chiave... Potete illuminarmi? Grazie.
__________________
|Java Base| |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
up
Solo questo: La challenge string deve essere casuale? o legata in qualche modo allo username? Grazie
__________________
|Java Base| |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Grazie.
Quale potrebbe essere un buon seme? Io avevo pensato a una cosa del tipo System.currentTimeMillis() % username.hashCode() in modo da legare tempo e username... oppure legando anche l'ip dell'host di provenienza (+?). Ha senso?
__________________
|Java Base| |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Java ha già un generatore "sicuro"....ora non mi ricordo il nome della classe...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
SecureRandom
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Grazie, ho scritto questo:
Codice:
public byte[] generateChallengeString(int length)
{
SecureRandom srand = null;
String algorithm = "SHA1PRNG";
try {
srand = SecureRandom.getInstance( algorithm );
} catch (NoSuchAlgorithmException nsae) {
logger.severe("RNG algorithm " + algorithm + "not available.");
throw new RuntimeException(nsae);
}
byte[] challenge = new byte[length];
srand.nextBytes( challenge );
return challenge;
}
Al limite inserisco un tempo di "leasing", oltre il quale la stringa non e' piu' valida - buona idea? pessima idea?
__________________
|Java Base| |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ogni numero casuale deve essere utilizzato una sola volta
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Si', certo, una volta ottenuta la risposta l'array viene buttato...
__________________
|Java Base| |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Ok, passo al calcolo della risposta.
non riesco a dare in pasto una stringa (la password) all'oggetto Mac: mac = Mac.getInstance( "HmacSHA512" ); // passo algoritmo mac.init( ?? ); // qui dovrei dargli una Key - ma io ho una stringa! // questo dovrebbe digerire la challenge string // (di tipo byte[], generata con il metodo sopra ) byte[] digest = mac.doFinal( challengeString ); Mi conviene reimplementarmi l'algoritmo HMAC? Grazie
__________________
|Java Base| |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Come chiave usi la password dell'utente sul server...
Se sul server non hai la password in chiaro usa lo stesso algoritmo con cui salvi la password sul server per ottenere l'hash in locale ed usa l'hash come chiave dell'HMAC... Il protocollo dovrebbe essere questo...supponiamo che la pass sia memorizzata sul server sottoforma di SHA1(password): Client = C, Server = S C->S: Username S->C: challengeString C->S: a = HMAC(SHA1(password), challengeString) Il server si calcola HMAC(passwordFingerprint, challengeString) e verifica che sia identica ad a... |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Ok. Ma il problema sta in hmac, praticamente lo devo implementare io,
visto che non riesco ad usare l'hmac gia' fatto. Grazie comunque.
__________________
|Java Base| |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non credo che ti convenga reimplementare l'HMAC...piuttosto implementa l'interfaccia Key
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Non sembra difficilissimo.
E poi non mi e' ben chiaro cosa dovrebbero fare i metodi di Key, e se la chiave deve rispettare certe condizioni, visto che Mac.init() puo' lanciare l'eccezione InvalidKeyException - if the given key is inappropriate for initializing this MAC. Oppure potrei usare semplicemente questo? http://www.exampledepot.com/egs/java...ty/Digest.html da quanto ho capito concatena stringa e chiave e calcola l'hash. E' meno sicuro? Mi rendo conto che e' una domanda insensata - d'altra parte non devo fare un sistema a prova di bomba, e' un semplice progettino. Grazie
__________________
|Java Base| |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
http://java.sun.com/j2se/1.5.0/docs/...etKeySpec.html
Non importa imlpementare l'interfaccia...si fa così !!! Key secreteKey = new SecretKeySpec(passwordFingerprint, "MioAlgoritmo"); |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Grazie mille!
Ho fatto un programmino di prova, sembra andare, se avro' problemi ritornero'.
__________________
|Java Base| |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:45.










|









