Шифрование URL в Java - PullRequest
       13

Шифрование URL в Java

7 голосов
/ 24 сентября 2008

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

Ответы [ 7 ]

3 голосов
/ 24 сентября 2008

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

2 голосов
/ 09 июня 2009

К сожалению, почти замечание просто в java :-), для этой простой и обычной задачи я не смог найти подготовленную библиотеку, я закончил тем, что написал это ( это был источник ):

 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);
}

}

1 голос
/ 24 сентября 2008

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

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

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

1 голос
/ 24 сентября 2008

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

1 голос
/ 24 сентября 2008

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

0 голосов
/ 09 июня 2009

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

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

0 голосов
/ 24 сентября 2008

Вы уверены, что не имеете в виду URL кодировать ?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...