¿Cuál es la mejor práctica para que un cliente automatizado se autentique en un servidor?

No codifique la contraseña. – Por varias razones además de la seguridad, será difícil cambiar la contraseña sin volver a compilar e implementar el código. Si el código se distribuye, debe tener en cuenta los problemas de seguridad.
¿Cuáles son las opciones? Solo un puñado de opciones y todo depende de su entorno y de cómo puede mitigar los riesgos.
Primero externaliza la contraseña del código. La forma más tradicional es almacenarlos en un archivo. Luego, encripte el archivo o bloquee el acceso al archivo.
Si su entorno admite mantener el archivo con credenciales bajo Usuario del sistema operativo y puede cifrarlo, entonces aproveche eso. Solo tiene que administrar el usuario del sistema operativo para ese cliente / proceso.
Este es siempre un tema polémico para discutir con los desarrolladores. Como cada elección, lo miran y dicen, ¿en qué se diferencia? en lugar de en el código ahora lo tienes en el archivo o en otro lugar. El punto es “desatar” su código de cualquier impacto en la política de contraseñas (sin recompilación) y almacenarlos en algún lugar donde existan controles apropiados (seguridad del sistema de archivos, usuario del sistema operativo, solo muy pocos usuarios autorizados / confiables obtendrán acceso, etc.).
O puede usar SSL de 2 vías si su servidor admite o autenticación basada en firma, pero eso requiere su propio mantenimiento en términos de configuración del certificado.
Entonces, cuando hay formas de encontrar una solución segura, la respuesta es demasiado complicada / lleva mucho tiempo. Por lo tanto, la codificación parece fácil de hacer, pero no es una buena opción, incluso si no tiene en cuenta la seguridad.

Aquí hay algunas ideas sobre cómo se podría hacer esto:


1) El CLIENTE necesita un medio para autenticarse (automáticamente) con el SERVIDOR a través de la interfaz (1)

2) Idealmente, NO queremos enviar contraseña / secreto a través de la interfaz (1)
2.1) Si tiene que hacerlo, asegúrese de que el canal esté encriptado usando algo como SSL / HTTPS. Utilice otras contramedidas de seguridad para proteger la contraseña compartida …

3) El mejor enfoque es hacer que el CLIENTE envíe una contraseña de un solo uso (OTP) al SERVIDOR para autenticarse.
3.1) Contraseña de un solo uso: es una contraseña que solo se puede usar una vez
3.2) Si se intercepta (después del uso), el OTP no será de utilidad para un atacante

4) Hay muchas formas de implementar OTP, pero si es posible, utilice un método basado en PKI (cifrado de clave pública / privada).
4.1) El CLIENTE tiene una PrivateKey que solo él conoce
4.2) SERVER tiene una PublicKey correspondiente a los usuarios PrivateKey (s).
4.3) Como parte del proceso de autenticación, el SERVIDOR envía un desafío al CLIENTE.
4.4) El CLIENTE encripta el desafío usando su PrivateKey
4.5) SERVER valida con la PublicKey del usuario

5) Cliente HSM (Módulo de seguridad de hardware)
5.1) Esto aumentará los costos, pero si puede permitírselo, PrivateKey debería estar oculto dentro de un HSM
5.2) Ningún humano debería necesitar acceder / ver la PrivateKey
5.3) El HSM admitirá un método para cifrar el desafío (desafío de cadenas)
5.4) HSM debe bloquearse para aceptar solo solicitudes de un CLIENTE dado