¿Cuál es la mejor manera de encriptar una URL con parámetros en Java?Cifrado de URL en Java
Respuesta
¿Estás seguro de que no significa URL codifica?
La codificación está disponible a través de java.net.URLEncoder.encode
.
API de seguridad de Java (http://java.sun.com/javase/technologies/security/) + codificación URL
La única manera de hacer esto es utilizar SSL/TLS (HTTPS). Si usa HTTP antiguo simple, la URL definitivamente se enviará sin cifrar.
Depende de su modelo de amenaza. Por ejemplo, si desea proteger los parámetros enviados por su aplicación Java a su servidor de un atacante que tiene acceso al canal de comunicación, debe considerar comunicarse con el servidor a través de TLS/SSL (es decir, HTTPS en su caso) y el gustos. Si desea proteger los parámetros de un atacante que tiene acceso a la máquina donde se ejecuta su aplicación de cliente Java, entonces tiene más problemas.
Si realmente no puede usar SSL, le sugiero un enfoque de clave precompartida y agregar un iv aleatorio.
Puede utilizar cualquier método de cifrado simétrico decente, por ej. AES usando una clave precompartida a la que se está comunicando fuera de banda (correo electrónico, teléfono, etc.).
Luego genera un vector de inicialización aleatorio y encripta su cadena con este iv y la clave. Finalmente concatenas tu texto de cifrado y el iv y lo envías como tu parámetro. El iv puede ser comunicado sin ningún riesgo.
Desafortunadamente casi de mención es simple en :-) java, para esta tarea simple y habitual yo no era capaz de encontrar una biblioteca preparada, terminé escribiendo esto (this was the source):
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEParameterSpec;
/**
* An easy to use class to encrypt and decrypt a string. Just call the simplest
* constructor and the needed methods.
*
*/
public class StringEncryptor {
private Cipher encryptCipher;
private Cipher decryptCipher;
private sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
private sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
final private String charset = "UTF-8";
final private String defaultEncryptionPassword = "PAOSIDUFHQWER98234QWE378AHASDF93HASDF9238HAJSDF923";
final private byte[] defaultSalt = {
(byte) 0xa3, (byte) 0x21, (byte) 0x24, (byte) 0x2c,
(byte) 0xf2, (byte) 0xd2, (byte) 0x3e, (byte) 0x19 };
/**
* The simplest constructor which will use a default password and salt to
* encode the string.
*
* @throws SecurityException
*/
public StringEncryptor() throws SecurityException {
setupEncryptor(defaultEncryptionPassword, defaultSalt);
}
/**
* Dynamic constructor to give own key and salt to it which going to be used
* to encrypt and then decrypt the given string.
*
* @param encryptionPassword
* @param salt
*/
public StringEncryptor(String encryptionPassword, byte[] salt) {
setupEncryptor(encryptionPassword, salt);
}
public void init(char[] pass, byte[] salt, int iterations) throws SecurityException {
try {
PBEParameterSpec ps = new javax.crypto.spec.PBEParameterSpec(salt, 20);
SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey k = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(pass));
encryptCipher = Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, k, ps);
decryptCipher = Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, k, ps);
} catch (Exception e) {
throw new SecurityException("Could not initialize CryptoLibrary: " + e.getMessage());
}
}
/**
*
* method to decrypt a string.
*
* @param str
* Description of the Parameter
*
* @return String the encrypted string.
*
* @exception SecurityException
* Description of the Exception
*/
public synchronized String encrypt(String str) throws SecurityException {
try {
byte[] utf8 = str.getBytes(charset);
byte[] enc = encryptCipher.doFinal(utf8);
return URLEncoder.encode(encoder.encode(enc),charset);
}
catch (Exception e)
{
throw new SecurityException("Could not encrypt: " + e.getMessage());
}
}
/**
*
* method to encrypting a string.
*
* @param str
* Description of the Parameter
*
* @return String the encrypted string.
*
* @exception SecurityException
* Description of the Exception
*/
public synchronized String decrypt(String str) throws SecurityException {
try {
byte[] dec = decoder.decodeBuffer(URLDecoder.decode(str,charset));
byte[] utf8 = decryptCipher.doFinal(dec);
return new String(utf8, charset);
} catch (Exception e) {
throw new SecurityException("Could not decrypt: " + e.getMessage());
}
}
private void setupEncryptor(String defaultEncryptionPassword, byte[] salt) {
java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
char[] pass = defaultEncryptionPassword.toCharArray();
int iterations = 3;
init(pass, salt, iterations);
}
}
La forma estándar de encriptar el tráfico HTTP es usar SSL.
Sin embargo, incluso a través de HTTPS, la URL y cualquier parámetro en ella (es decir, una solicitud GET) se enviarán sin cifrar. Debería usar SSL y hacer una solicitud POST para encriptar correctamente sus datos.
Como se señala en los comentarios, los parámetros se cifrarán independientemente del método HTTP que utilice, siempre que utilice una conexión SSL.
¿Es esto correcto? Al usar SSL/TLS, pensé que la URL estaba encriptada como un parámetro del comando HTTP (por ejemplo, GET, POST). El dominio se envía sin cifrar, pero creo que el resto está encriptado dentro de la porción TLS del paquete. –
No es cierto. La solicitud de DNS se envía en forma clara. Luego se configura un túnel SSL. A continuación, la solicitud HTTP, incluido el URI, se envía a través de ese túnel. – Quentin
- 1. Cifrado RSA en Java
- 2. Cifrado simple de Java
- 3. Cifrado César simple en java
- 4. Cifrado con BlowFish en Java
- 5. Biblioteca de cifrado bidireccional Java
- 6. Uso de HTTPS en Java sin cifrado
- 7. Cifrado de una cadena a una URL en C#
- 8. Cifrado RSA: Java a PHP
- 9. Puerto RSA código Java cifrado en C#
- 10. cifrado Triple DES y descifrado en Java
- 11. Uso del cifrado de openssl con Java
- 12. Java 7 keytool Cifrado de curva elíptica
- 13. Unescape url en java
- 14. Enrutamiento de URL en Java
- 15. cifrado RSA: Diferencia entre Java y Android
- 16. Asesorar sobre el rendimiento del cifrado de archivos en Java
- 17. ¿Algún tutorial sobre cifrado de clave pública en java?
- 18. Convertir cadenas en claves de cifrado y viceversa java
- 19. Cifrado de Blowfish en android
- 20. Cifrado de Android
- 21. ¿Cifrado y cifrado son diferentes?
- 22. URL con parámetros en Java
- 23. Java HttpServletRequest obtener URL en los navegadores Barra de URL
- 24. Cifrado RSA en Java: ¿Problemas con la plataforma cruzada?
- 25. cifrado RSA-descifrado en iPhone
- 26. ¿Es seguro este hilo de código de cifrado de Java?
- 27. de cifrado AES de Java Clave no válida longitud
- 28. Buena lista de suites de cifrado débiles para Java
- 29. Java: ¿URL o cadena?
- 30. ¿Hay una buena biblioteca de cifrado GnuPG para Java/Scala?
¿Puede ser más específico, por favor? – boes