Otros han abordado el hecho de que estás violando el Principio de Kerckhoffs. Me gustaría sugerir una manera de volver a redactar su propuesta que no lo haga.
Hacer que tu función sea parte de la clave
Si tratamos su "función que solo usted conoce" como parte de la "clave", entonces no es una violación del Principio de Kerckhoff. Es decir, tomamos su "llave" para tener dos partes. La frase de contraseña de entrada, p , y la función secreta, f .
¿Su función es deducible de su salida?
¿Vas a memorizar tanto p como f ? Probablemente. ¿Utilizará un único p y f para cada servicio que utilice? Probablemente no.
Es decir, espero que se sienta tentado a cambiar solo p para diferentes casos mientras reutiliza el mismo f . Esto puede hacerse seguro, pero lo que describe con su ejemplo no lo es. Esto se debe a que si un atacante obtiene un par de sus contraseñas derivadas, diga f ("correcthorse") yf ("batterystaple"), podrán averiguar qué es f .
Corrige haciendo de tu función una función pseudoaleatoria
Entonces, si quieres hacer esto, necesitarás un f que no es deducible del atacante que tiene n de tu contraseña derivada, f ( p1 ) ... f ( pn ). Hay funciones criptográficas que harán esto por ti. HMAC es lo que viene a la mente inmediatamente.
Deje que f (p) = HMAC ("algún secreto constante que solo conozca", p)
De esta manera, un atacante que envejeció de f (p) tendría dificultades para descubrir el secreto constante, especialmente si no supiera p .
Problemas de codificación
Tenga en cuenta que la salida de f (p) no será texto ASCII. Así que necesitarías transformarlo en algo utilizable como contraseña donde lo necesites. Es difícil hacer esto en general. Por ejemplo, si usaste la codificación base64, deberías asegurarte de que el lugar donde estás utilizando la contraseña generada acepte todos los símbolos que pueden aparecer en base64. Del mismo modo, si utiliza una representación hexadecimal, es posible que no obtenga todos los "símbolos" que algunos servicios pueden requerir para una contraseña.
Son estos problemas de codificación por los que este sistema no funciona como un esquema general. Puede usarse y luego manipularse manualmente, caso por caso, pero eso significa que solo puede usarlo en un par de casos.