2010-07-06 10 views
9

Soy nuevo en el cifrado.cifrado de Java alternitivo a la clave codificada

He mirado en la documentación javax.crypto y consiguió el cifrado de un archivo para trabajar con este código ...

File saveFile = new File("Settings.set"); 
     saveFile.delete(); 
     FileOutputStream fout = new FileOutputStream(saveFile); 

     //Encrypt the settings 
     //Generate a key 
     byte key[] = "My Encryption Key98".getBytes(); 
     DESKeySpec desKeySpec = new DESKeySpec(key); 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
     SecretKey skey = keyFactory.generateSecret(desKeySpec); 

     //Prepare the encrypter 
     Cipher ecipher = Cipher.getInstance("DES"); 
     ecipher.init(Cipher.ENCRYPT_MODE, skey); 
     // Seal (encrypt) the object 
     SealedObject so = new SealedObject(this, ecipher); 

     ObjectOutputStream o = new ObjectOutputStream(fout); 
     o.writeObject(so); 
     o.close(); 

Sin embargo, si usted fuera un hacker inteligente (o tal vez incluso de aficionados desde que cuenta de esto fuera), todo lo que tendría que hacer es abrir el archivo de clase que contiene este código, y la clave de cifrado (Mi clave de cifrado98) es claramente visible.

¿Cómo cifras la clave de cifrado? ... jaja ... ¿puedes?

Gracias por su ayuda!

+0

Como nota lateral, puede que desee rediseñar su 'Cipher. getInstance ("DES") 'llamada al método: http://stackoverflow.com/questions/3180878/exception-in-es-decryption-algorithm-in-java/3181250#3181250 –

Respuesta

6

Si el atacante tiene acceso tanto al software como al archivo, podría descifrarlo. Hay algunas maneras de resolver esto:

  • Utilice las teclas asimétricas. Cifre el archivo con la clave pública, y solo se puede descifrar con una clave privada. Esto supone que el software no necesita descifrar el archivo.
  • Usa el intercambio Diffie-Hellman. Si desea enviar una información encriptada a través de la red, ambas partes pueden establecer una clave sin que un atacante lo sepa.

Si el programa necesita encriptar y descifrar los datos, no hay nada que pueda hacer. El atacante puede simplemente ejecutar el programa y mirar la información descifrada.

0

No creo que esto sea posible sin que el usuario ingrese la clave de cifrado y descifrado.

Puede emplear alguna técnica para dificultar la visualización de la clave sin el código fuente completo, pero no sería segura.

+0

¡Gracias por su ayuda! – DRJTower

0

Si su programa puede encriptar/desencriptar un archivo por sí mismo, todo lo que necesita para realizar el descifrado ya está integrado en el programa, por lo que un alborotador determinado podría descifrar los archivos que cifró.

Si es posible, solicite al usuario una 'contraseña' y use lo que le dan como clave de cifrado/descifrado.

0

¿Es importante que el usuario no pueda ver su propia clave de cifrado? ¿O simplemente importante que al descubrir su llave ganada, el usuario no debería conocer la llave de todos los demás?

Puede pedirle al usuario una clave personal y almacenarla externamente o avisarle al usuario cada vez que la necesite. De esta forma, la clave de cada usuario sería suya y no sería utilizable para descifrar documentos almacenados por otros usuarios en otras máquinas.

3

Un atacante siempre puede hacer todo lo que el programa puede hacer y generalmente un poco más. La única forma de proteger las cosas es utilizar información que no esté bajo el control del programa. Solicite al usuario que ingrese una contraseña o coloque información en una tienda bajo el control del sistema operativo. Lo último no ayudará si un atacante tiene acceso físico o incluso muchos derechos, a menos que haya hardware especial como un Módulo de plataforma confiable (TPM).

1

Bueno, si el programa puede descifrar los datos sin la entrada adicional del usuario, realmente no se puede evitar que otra persona acceda al archivo si tiene acceso al programa.

Si solo está orientado a Windows, es posible que desee consultar el Data Protection API (DPAPI). Básicamente, hace lo mismo, pero la contraseña utilizada para el cifrado está protegida por el sistema operativo en un ámbito de usuario (o máquina). En pocas palabras: necesita el inicio de sesión de usuario (o un programa que se ejecuta en la cuenta de usuario determinada) para acceder a la clave (o para el alcance de la máquina, el inicio de sesión para cualquier usuario en la máquina).

No sé cómo acceder a la API desde Java, pero Google muestra algunas bibliotecas contenedoras.

1

No codificar la clave. Suponiendo que no tiene un usuario a mano para ingresar la frase de contraseña, configure su código para extraer la clave de cifrado de un archivo simple y luego confíe en la seguridad del sistema operativo para mantener el archivo a salvo. Proporcione una forma de migrar a una nueva clave cuando el administrador del sistema lo considere necesario.

0

el método más seguro no se utiliza ningún tipo de cifrado, sólo hay que poner sus user.properties a su directorio, con la siguiente código:

String userhome = System.getProperty("user.home"); 
String username = system.getProperty("user.name"); 
String hostname = java.net.InetAddress.getLocalHost().getHostName(); 

if (hostname.equals("webserver") && username.equals("root")){ 
ResourceBundle user = ResourceBundle.getBundle(userhome/ "user.properties"); 
} 
Cuestiones relacionadas