Каков наилучший способ шифрования URL-адреса с параметрами в Java?URL-шифрование в Java
ответ
Вы уверены, что не имеете значения URL encode?
Кодирование доступно через java.net.URLEncoder.encode
.
апи безопасности Java (http://java.sun.com/javase/technologies/security/) + URL кодирование
Единственный способ сделать это состоит в использовании SSL/TLS (HTTPS). Если вы используете простой старый HTTP, URL-адрес определенно будет отправлен в clear.
Это зависит от вашей модели угрозы. Например, если вы хотите защитить параметры, отправленные вашим Java-приложением, на ваш сервер от злоумышленника, имеющего доступ к каналу связи, вам следует подумать об общении с сервером через TLS/SSL (т. Е. HTTPS в вашем случае) и нравится. Если вы хотите защитить параметры от злоумышленника, у которого есть доступ к машине, на которой работает ваше клиентское приложение Java, вы испытываете более глубокие проблемы.
Если вы действительно не можете использовать SSL, я бы предложил подход с общим ключом и добавив случайный iv.
Вы можете использовать любой приемлемый симметричный метод шифрования ex. AES, используя предварительно разделяемый ключ, вы общаетесь вне диапазона (электронная почта, телефон и т. Д.).
Затем вы создаете случайный вектор инициализации и шифруете свою строку с помощью этого iv и ключа. Наконец, вы объединяете свой шифрованный текст и iv и отправляете это как свой параметр. IV можно сообщать в ясности без какого-либо риска.
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);
}
}
Стандартный способ шифрования HTTP-трафика - использовать SSL.
Однако даже через HTTPS URL-адрес и любые параметры в нем (т. Е. Запрос GET) будут отправлены в поле clear. Вам нужно будет использовать SSL и выполнить запрос POST для правильной шифровки ваших данных.
Как указано в параметрах комментариев, будут зашифрованы независимо от того, какой метод HTTP вы используете, если вы используете SSL-соединение.
Правильно ли это? При использовании SSL/TLS я думал, что URL-адрес был зашифрован как параметр для команды HTTP (например, GET, POST). Домен отправляется в ясном виде, но я думаю, что остальное зашифровано в части TLS пакета. – 2010-02-14 19:53:16
- 1. java beans в java
- 2. Реализация Java в Java
- 3. Аргументы Java в java -ORBInitialPort
- 4. Чтение файла .java в Java
- 5. конкатенировать файлы .java в java
- 6. parse java string в java
- 7. Java NullPointerException в Java-агенте
- 8. Java Multiple Comparision в Java
- 9. Как вычислить использование java-процесса в java-процессе в java
- 10. Преобразование .java в .class в java-программе
- 11. Своп-строки в Java. Новичок в Java
- 12. в Java
- 13. Интерпретация Java-кода в Java-приложении - как запустить Java-код в java-программе
- 14. Java error- Java не может загрузить в виртуальной машине Java
- 15. Как импортировать java-класс из библиотеки java в код java
- 16. Java: Разбор JSON отформатированные строки в Java
- 17. В чем разница между **/*. Java и * .java?
- 18. Преобразование последовательного Java в параллельный Java-код
- 19. java package vs System в JAVA
- 20. Java - есть ли раковина в Java
- 21. Java-анализатор исходного кода Java в Ruby
- 22. скомпилировать java в другом пути от java
- 23. Запись непрерывной петли для java в java
- 24. Groovy, встроенный в Java, перезвонив на Java
- 25. запустить программу scala в java-файле java
- 26. Преобразование Java 8 в Java 1.5
- 27. Java Installed vs Java Включено в браузере
- 28. Java Servlet диспетчеру в другой файл Java
- 29. Java-интерпретатор или компилятор в java
- 30. Java: подсчет вхождения в массив java
Вы можете быть более конкретным, пожалуйста? – boes 2008-09-23 21:35:52