# Secure Remote Password

Secure Remote Password (SRP; en español «contraseña remota segura») es un protocolo aumentado de establecimiento autenticado de claves de contraseña (PAKE, por sus siglas en inglés: «Password-Authenticated Key Agreement») específicamente diseñado para adaptarse a las patentes existentes.
Al igual que todos los protocolos PAKE aumentados, un intruso situado entre las dos partes no puede obtener la suficiente información como para adivinar mediante la fuerza bruta la contraseña sin interaccionar con ambas partes en cada intento. Esto significa que se puede obtener una fuerte seguridad incluso utilizando contraseñas débiles. Además, el servidor no almacena ningún dato equivalente a una contraseña. Con lo cual, un atacante que lograra robar los datos del servidor no podría hacerse pasar por el cliente a menos que primero realizara una búsqueda de la contraseña mediante fuerza bruta.

## Descripción general

El protocolo SRP permite al usuario autenticarse ante el servidor mediante el envío de una prueba de conocimiento cero. Es resistente a los ataques de diccionario que pudiera intentar un intruso y no requiere de una tercera parte verificada. Además, sigue siendo seguro incluso si son atacadas una o dos de las primitivas criptográficas que utiliza. Por último, el protocolo SRP ha sido revisado en varias ocasiones (siendo la revisión 6a la versión actual). Así, por ejemplo, desde la sexta revisión sólo se puede adivinar una contraseña por cada intento de conexión.
El protocolo SRP crea una clave privada grande que es compartida entre las dos partes de forma similar a como lo hace el prococolo Diffie-Hellman, después verifica a ambas partes que la clave es idéntica y que ambas tienen la contraseña del usuario. En los casos en que se requiere tanto cifrar las comunicaciones como autenticar a las partes, el protocolo SRP es más seguro que su alternativa, el protocolo SSH, y más rápido que utilizar el protocolo Diffie-Hellman para firmar los mensajes. Además, no necesita de terceras partes, al contrario que Kerberos.
SSL/TLS utiliza la sexta revisión del protocolo SRP para autenticar a las partes (en TLS-SRP) así como los estándares EAP y SAML. Y está siendo estandarizado en IEEE P1363 e ISO/IEC 11770-4.

## Otras implementaciones

* OpenSSL versión 1.0.1 o posterior.
* TLS-SRP es un set de conjuntos de cifrado para asegurar la seguridad de la capa de transporte que utiliza SRP.
* srp-client implementación en Javascript de la versión 6a de SRP (compatible con RFC 5054). Código abierto. Licencia MPL.
* La biblioteca Crypto de Javascript incluye una implementación en Javascript del protocolo SRP. Código abierto. Licencia BSD.
* Gnu Crypto provee una implementación en Java licenciada bajo la licencia GPL con la excepción para bibliotecas, que permite utilizarla como biblioteca en conjunción con software privado.
* Bouncy Castle provee implementaciones en Java y C# bajo la licencia MIT.
* Nimbus SRP es una biblioteca Java sin dependencias externas. Licencia Apache 2.0.
* srplibcpp es una implementación en C++ basada en MIRACL.
* DragonSRP es una implementación modular en C++ que actualmente funciona con OpenSSL.
* Json2Ldap proporciona autentificación SRP (versión 6a) a los servidores LDAP.
* csrp implementación en C de la versión 6a.
* Crypt-SRP implementación en Perl de la versión 6a.
* pysrp implementación en Python de la versión 6a (compatible con csrp).
* El sistema de cuentas del framework web Meteor implementa el protocolo SRP para autenticar las contraseñas.
* srp-rb implementación en Ruby de la versión 6a.
* srp-6a-demo implementación en PHP y Javascript de la versión 6a.
* thinbus-srp-js implementación de la versión 6a en Java y Javascript que utiliza Nimbus SRP. Licencia Apache.
* TheIceNet Cryptography Librería Java de criptografía para aplicaciones Spring Boot. Implementa SRP-6a. Bajo Licencia Apache.