Mã hóa URL trong Java


6

Cách tốt nhất để mã hóa một URL với các tham số trong Java là gì?

  0

Bạn có thể cụ thể hơn không? 23 sep. 082008-09-23 21:35:52

0

Bạn có chắc chắn bạn không có nghĩa là URL mã hóa?

Mã hóa có sẵn thông qua java.net.URLEncoder.encode.


1

an ninh java api (http://java.sun.com/javase/technologies/security/) + url encoding


3

Cách duy nhất để làm điều này là sử dụng SSL/TLS (https). Nếu bạn sử dụng HTTP cũ đơn giản, URL chắc chắn sẽ được gửi đi rõ ràng.


1

Nó phụ thuộc vào mô hình mối đe dọa của bạn. Ví dụ, nếu bạn muốn bảo vệ các thông số được gửi bởi ứng dụng Java của bạn đến máy chủ của bạn từ kẻ tấn công có quyền truy cập vào kênh truyền thông, bạn nên xem xét việc liên lạc với máy chủ qua TLS/SSL (ví dụ, HTTPS trong trường hợp của bạn) và thích. Nếu bạn muốn bảo vệ các thông số từ kẻ tấn công có quyền truy cập vào máy nơi ứng dụng khách Java của bạn chạy, thì bạn đang gặp rắc rối sâu hơn.


1

Nếu bạn thực sự không thể sử dụng SSL, tôi sẽ đề xuất phương pháp tiếp cận chính được chia sẻ trước và thêm iv ngẫu nhiên.

Bạn có thể sử dụng bất kỳ phương thức mã hóa đối xứng phù hợp nào. AES sử dụng khóa chia sẻ trước mà bạn đang giao tiếp ngoài băng tần (email, điện thoại, v.v.).

Sau đó, bạn tạo một vector khởi tạo ngẫu nhiên và mã hóa chuỗi của bạn bằng mã iv và khóa này. Cuối cùng bạn ghép nối văn bản mã hóa của bạn và iv và gửi thông số này làm tham số của bạn. Iv có thể được truyền đạt rõ ràng mà không gặp bất kỳ rủi ro nào.


2

Unfortunatelly gần như chú ý là đơn giản trong java :-), cho nhiệm vụ này đơn giản và thông thường tôi wasnt thể tìm thấy một thư viện chuẩn bị, tôi đã kết thúc bằng văn bản này (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

Cách tiêu chuẩn để mã hóa lưu lượng HTTP là sử dụng SSL. Tuy nhiên, ngay cả trên HTTPS, URL và bất kỳ tham số nào trong đó (ví dụ: yêu cầu GET) sẽ được gửi đi rõ ràng. Bạn sẽ cần sử dụng SSL và thực hiện yêu cầu POST để mã hóa dữ liệu của mình một cách chính xác.

Như được chỉ ra trong thông số nhận xét sẽ được mã hóa bất kể bạn sử dụng phương thức HTTP nào, miễn là bạn sử dụng kết nối SSL.

  0

Điều này có đúng không? Khi sử dụng SSL/TLS, tôi cho rằng URL đã được mã hóa dưới dạng tham số cho lệnh HTTP (ví dụ: GET, POST). Tên miền được gửi đi rõ ràng, nhưng tôi nghĩ phần còn lại được mã hóa trong phần TLS của gói. 14 feb. 102010-02-14 19:53:16

+1

Không đúng sự thật. Yêu cầu DNS được gửi đi rõ ràng. Sau đó, một đường hầm SSL được thiết lập. Sau đó, yêu cầu HTTP - bao gồm URI - được gửi qua đường hầm đó. 17 may. 112011-05-17 14:23:17