URL-шифрование в Java


6

Каков наилучший способ шифрования URL-адреса с параметрами в Java?

  0

Вы можете быть более конкретным, пожалуйста? 23 сен. 082008-09-23 21:35:52

0

Вы уверены, что не имеете значения URL encode?

Кодирование доступно через java.net.URLEncoder.encode.


1

апи безопасности Java (http://java.sun.com/javase/technologies/security/) + URL кодирование


3

Единственный способ сделать это состоит в использовании SSL/TLS (HTTPS). Если вы используете простой старый HTTP, URL-адрес определенно будет отправлен в clear.


1

Это зависит от вашей модели угрозы. Например, если вы хотите защитить параметры, отправленные вашим Java-приложением, на ваш сервер от злоумышленника, имеющего доступ к каналу связи, вам следует подумать об общении с сервером через TLS/SSL (т. Е. HTTPS в вашем случае) и нравится. Если вы хотите защитить параметры от злоумышленника, у которого есть доступ к машине, на которой работает ваше клиентское приложение Java, вы испытываете более глубокие проблемы.


1

Если вы действительно не можете использовать SSL, я бы предложил подход с общим ключом и добавив случайный iv.

Вы можете использовать любой приемлемый симметричный метод шифрования ex. AES, используя предварительно разделяемый ключ, вы общаетесь вне диапазона (электронная почта, телефон и т. Д.).

Затем вы создаете случайный вектор инициализации и шифруете свою строку с помощью этого iv и ключа. Наконец, вы объединяете свой шифрованный текст и iv и отправляете это как свой параметр. IV можно сообщать в ясности без какого-либо риска.


2

Unfortunatelly почти отметить просто в Java :-), для этой простой и обычной задачи я не был в состоянии найти готовую библиотеку, я закончил писать этот (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); 
} 

}


0

Стандартный способ шифрования HTTP-трафика - использовать SSL. Однако даже через HTTPS URL-адрес и любые параметры в нем (т. Е. Запрос GET) будут отправлены в поле clear. Вам нужно будет использовать SSL и выполнить запрос POST для правильной шифровки ваших данных.

Как указано в параметрах комментариев, будут зашифрованы независимо от того, какой метод HTTP вы используете, если вы используете SSL-соединение.

  0

Правильно ли это? При использовании SSL/TLS я думал, что URL-адрес был зашифрован как параметр для команды HTTP (например, GET, POST). Домен отправляется в ясном виде, но я думаю, что остальное зашифровано в части TLS пакета. 14 фев. 102010-02-14 19:53:16

+1

Неправда. Запрос DNS отправляется в clear. Затем настраивается SSL-туннель. Затем HTTP-запрос, включая URI, отправляется через этот туннель. 17 май. 112011-05-17 14:23:17