Шифрование URL-адресов в Java

Как лучше всего зашифровать URL-адрес с параметрами в Java?

Не могли бы вы уточнить, пожалуйста?

boes 24.09.2008 01:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
26 630
7

Ответы 7

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

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

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

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

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

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

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

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

К сожалению, в 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);
}

}

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

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

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

Matt Ball 14.02.2010 22:53

Не правда. Запрос DNS отправляется в открытом виде. Затем настраивается SSL-туннель. Затем HTTP-запрос, включая URI, отправляется через этот туннель.

Quentin 17.05.2011 18:23

Другие вопросы по теме