Soy bastante nuevo en la criptografía, pero recientemente decidí asumir el reto de intentar escribir un administrador de contraseñas Java que pudiera almacenar las contraseñas en la máquina local sin dejar de ser seguro. Estos eran mis pensamientos, así que me preguntaba si alguien podría señalar algún defecto de seguridad obvio.
-
El usuario ingresa su contraseña maestra, diga "contraseña". La "contraseña" se encripta utilizando 2 semi- primos RSA diferentes a 2 valores BigInteger diferentes. Para este ejemplo no voy a usar números masivos. Diga 5324541 y 10983747. El primer valor cifrado, 5324541, se almacenó en un archivo .txt, por lo que el valor cifrado de la contraseña maestra se verifica para determinar si el programa continúa o no.
-
Habrá otro archivo .txt que almacena los números correspondientes a las contraseñas de los usuarios, digamos
- Facebook, 4363454
- Twitter, 3423421
- Instagram, 9997532
- Banco, 671
- iTunes, 1400000
-
El segundo número, 10983747 (este no se almacenó en la máquina, se generó sobre la marcha cuando el usuario ingresó la contraseña maestra) se usará para generar los valores reales necesarios para recuperar las contraseñas.
- 10983747 + 4363454
- 10983747 + 3423421
- 10983747 + 9997532
- 10983747 + 671
- 10983747 + 1400000
-
Estos serán los valores que las contraseñas individuales tienen. Planeo hacer un hash de cada una de las contraseñas individuales de Big Integers para evitar colisiones, pero planeo hacer que la función sea bastante fácil de calcular y fácilmente invertible (no segura en absoluto). Por ejemplo, la contraseña "hola" se asignaría a algún número, digamos 54338988, pero el número almacenado en el archivo txt sería (54338988 - 10983747). De esta manera, nadie podría descubrir cuál era el hash real sin saber la segunda clave que solo se puede generar al vuelo mediante la contraseña maestra.
También he estado pensando en implementar una función para protegerme contra el registro de teclas si el usuario quisiera. Se generaría una bijección aleatoria desde el conjunto de caracteres a sí mismos cada vez que se ejecutó. Si la contraseña del usuario era "ab" (ejemplo simplificado) y el mapa dice que debe escribir "F" para una y "!" para b entonces debes ingresar "F!" como su contraseña y el programa utilizaría la bijección que construí para averiguar lo que realmente quería decir.
Como dije, soy algo nuevo en la criptografía, por lo que puede haber alguna supervisión importante aquí. Realmente apreciaría cualquier información sobre posibles problemas, fallas de seguridad o sugerencias, ya que estoy realmente interesado en aprender sobre el tema. Gracias!