Attualmente sto implementando un servizio web di riposo con Spring + Java + Tomcat e un client cmd per accedervi. Il requisito più importante è limitare l'utilizzo agli utenti autenticati: la crittografia non è così importante.
Poiché non posso garantire che il servizio sia accessibile tramite TLS, non posso utilizzare l'autenticazione di base con nome utente e password.
La mia idea è di fare quanto segue:
- Ottieni un nonce dal servizio web - che è cambiato dopo ogni richiesta
- Calcola una firma con DSA di (richiesta + nonce)
- Aggiungi firma all'intestazione HTTP e controllala nel servizio web
Come creerei la firma:
// To generate the keys
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
KeyPair pair = keyGen.generateKeyPair();
// Per request
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
dsa.initSign(pair.getPrivate);
dsa.update(...)
byte[] signature = dsa.sign();
Per verificare la firma:
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
sig.initVerify(pubKey);
sig.update(...)
boolean ok = sig.verify(sigToVerify);
Ho sentito tanto parlare di non implementare la tua sicurezza, ed è per questo che vorrei sapere se altre persone vedono qualcosa che non conosco.
Qualcuno vede un grosso problema con questo approccio?