Sin límite de contraseña. Si pueden escribirlo desde su teclado, independientemente del teclado regional que usen. Es posible que desee imponer una longitud mínima, opciones como al menos un número y un carácter especial, pero sin límite máximo.
En relación con su segunda pregunta. La forma en que lo implementaría es creando campos separados a medida que mejora la fortaleza de las contraseñas. Por ejemplo, ahora tendría dos campos relacionados con la contraseña: salt, password_md5. Digamos luego que quieres usar sha256. Crea un nuevo campo llamado password_sha256. Cuando el usuario inicia sesión, primero verifique password_sha256. Si ese campo está vacío, verifique password_md5. Si eso coincide, ahora tiene la contraseña de texto sin formato que ingresó el usuario. A continuación, puede generar la contraseña sha256 (también restablecería la sal para una buena medida) y almacenar el nuevo valor. Luego, borraba el valor en password_md5 para que nadie pudiera revertirlo para obtener la contraseña.
Personalmente, me gustaría ir con el mejor hash que tu lenguaje puede hacer y usar eso. Lo importante es aplicar una buena política de contraseña mínima, no importa cuán seguro es el hash cuando la contraseña es "1234", y sembrar el hash con un carácter aleatorio para evitar ataques de diccionario.
Uso keepass que tiene una opción para usar "caracteres ANSI altos como el siguiente:' iôhQná "« - óÓSGÉH © ®EqjË = «ÒquW6> \ Jò-§'. – RCIX
No sé si el comentario de RCIX pretende contradecir lo que Kevin dice, pero esos no son caracteres de control y no estarían prohibidos por las reglas sugeridas. Simplemente no son ASCII de 7 bits. –
No era la respuesta que esperaba, pero aparentemente es la más razonable. Muchos sistemas imponen restricciones, y supuse que tenían una buena razón. Si es así, aquí nadie parece saber qué son, ¡así que cambiaré mi suposición! Algunas otras respuestas aquí son más acerca de las restricciones que deberían imponerse, en lugar de los caracteres que deberían permitirse. –