¿Es esta una configuración segura para un administrador de contraseñas de Java?

0

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.

  1. 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.

  2. 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
  3. 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
  4. 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!

    
pregunta jmon117 29.10.2016 - 19:34
fuente

1 respuesta

3

En primer lugar, no debe hacer su propio en una situación donde la seguridad es importante. (Solo jugar por diversión y aprender es un asunto diferente, por supuesto).

En segundo lugar, estoy de acuerdo con schroeder en que debe consultar el código fuente de los administradores de contraseñas existentes y aprender de ellos.

Dicho esto, aquí hay dos grandes problemas con su diseño:

  • Digamos que un atacante sabe, por ejemplo, La contraseña de Facebook de la víctima. Ella ejecuta esa contraseña a través de su función y obtiene 15347201. Luego, resta el valor almacenado para Facebook en su archivo de texto (4363454) y obtiene el número secreto 10983747. Ahora tiene el número que le permitirá descifrar cualquiera de las otras contraseñas.
  • No hay ningún paso que sea lento por diseño para evitar el forzamiento brutal. Por lo general, se usa el estiramiento de la clave para esto, es decir, el hashing de la contraseña maestra con una función de hash lenta (por ejemplo, bcrypt de PBKDF2) para generar la clave de cifrado.

También puede haber otras fallas, pero esto debería ser suficiente para hacer que quieras elegir otro esquema.

    
respondido por el Anders 29.10.2016 - 20:04
fuente

Lea otras preguntas en las etiquetas