Podría haber razones legítimas para restringir el conjunto de caracteres permitidos en las contraseñas. Por ejemplo, si la contraseña contenía un carácter que no era un carácter ASCII imprimible, entonces los problemas de codificación podrían causar que se rechace una contraseña correcta en algunas circunstancias.
Además, si un usuario en diferentes momentos necesita escribir la misma contraseña en diferentes distribuciones de teclado, entonces puede ser problemático utilizar caracteres que se ubican de manera diferente en esas distribuciones de teclado.
Un adversario podría ser capaz de averiguar qué usuarios se ven afectados por los problemas anteriores y de esa manera obtener algún conocimiento sobre qué caracteres han utilizado esos usuarios en su contraseña.
Restringir el conjunto de caracteres permitidos por las razones anteriores no tiene que debilitar la fortaleza de las contraseñas. Todo lo que tienes que hacer es hacer que la contraseña sea un poco más larga. (En el caso extremo, si dejó de permitir que todo el ASCII imprimible solo permita letras minúsculas, tendría que aumentar la longitud de la contraseña en un 40% para tener la misma entropía).
También hay malas razones para restringir el conjunto de caracteres permitidos. Por ejemplo, si un sistema restringe el conjunto de caracteres permitidos para evitar ataques de inyección de SQL, le informará sobre dos fallas de seguridad en el sistema. En primer lugar, no utiliza el escape adecuado para las consultas SQL. En segundo lugar, claramente no utiliza ningún hashing de contraseñas.
Para la longitud de la contraseña, una limitación puede ser una buena idea para evitar problemas en caso de que algún cliente esté aplicando limitaciones arbitrarias en los campos de entrada. Por ejemplo, si alguien pensó que era una buena idea usar un carácter con signo para indicar la longitud de un campo, eso no tendría más de 127 caracteres como máximo. He creado sistemas en los que apliqué una longitud máxima de 125 caracteres en las contraseñas como medida de precaución contra tales posibilidades (y posiblemente un par de errores off-by-one).
La imposición de una longitud máxima en las contraseñas reduce la seguridad si esa longitud máxima es demasiado corta. Debe comparar con las primitivas criptográficas simétricas que podría estar usando. Eso significa que debemos comparar con los tamaños de bloque y clave de cifrado de bloque, así como la salida de funciones hash. Eso significa que normalmente esperaríamos de 128 a 512 bits de seguridad de nuestras primitivas criptográficas. No permitir contraseñas que puedan coincidir con esos niveles de seguridad sería contraproducente. Dependiendo del conjunto de caracteres permitido, podría haber desde 4.7 (solo letras minúsculas) hasta 6.57 (todos los ASCII imprimibles) bits de entropía por carácter en una contraseña segura. Con un poco de matemática, vemos que si no permitimos al menos 20 caracteres, definitivamente establecemos el límite demasiado bajo, y si permitimos 109 caracteres, deberíamos estar muy seguros.
Es poco probable que un límite superior a 100 o 125 tenga un impacto real en la seguridad, porque es muy probable que ningún usuario suba tanto.
Cuando menciona una longitud máxima de 16 caracteres que se están aplicando, esto indica que es probable que los diseñadores hayan introducido ese límite por una mala razón. Una mala razón sería que la contraseña se almacena como texto sin formato y solo se asignaron 16 caracteres para el almacenamiento. Otra razón no tan mala sería que la contraseña se usa directamente como clave para una primitiva criptográfica (como AES).
La combinación de las dos restricciones (no permitir dos caracteres específicos y un límite máximo pequeño) es una señal de advertencia, ya que cada uno de ellos podría ser una elección debido a que las contraseñas se almacenan como texto sin formato.
Que el par específico de caracteres que decidieron rechazar es espacios y barras suena aterrador, porque las razones que podría imaginar para esos dos caracteres específicos que no se permiten es que podrían querer poner la contraseña de texto sin formato en un nombre de archivo o una línea de comando. Esperemos que solo sea cuestión de que me falte un poco de imaginación.