Actualmente estoy implementando un servicio web de descanso con Spring + Java + Tomcat y un cliente cmd para acceder a él. El requisito más importante es restringir el uso a usuarios autenticados; el cifrado no es tan importante.
Como no puedo garantizar que se acceda al servicio a través de TLS, no puedo usar la autenticación básica con nombre de usuario y contraseña.
Mi idea es hacer lo siguiente:
- Obtenga una licencia del servicio web, que se modifica después de cada solicitud
- Calcular una firma con DSA de (request + nonce)
- Agregue la firma al encabezado HTTP y verifíquelo en el servicio web
Cómo crearía 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();
Para comprobar la firma:
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
sig.initVerify(pubKey);
sig.update(...)
boolean ok = sig.verify(sigToVerify);
Escuché mucho sobre no implementar tu propia seguridad, por lo que me gustaría saber si otras personas ven algo que yo no.
¿Alguien ve un problema importante con este enfoque?