Java中的URL加密


6

在Java中使用参数加密URL的最佳方式是什么?

  0

你能更具体吗? 23 9月. 082008-09-23 21:35:52

0

你确定你不是说URL编码

编码可通过java.net.URLEncoder.encode获得。


1

Java安全API(http://java.sun.com/javase/technologies/security/)+ url编码


3

做到这一点的唯一方法是使用SSL/TLS(HTTPS)。如果您使用普通的旧HTTP,则URL一定会以明文形式发送。


1

这取决于您的威胁模型。例如,如果要保护Java应用程序发送给服务器的参数与攻击者可访问通​​信通道的信息有关,则应考虑通过TLS/SSL与服务器通信(例如,HTTPS)和喜欢。如果您想保护访问Java客户端应用程序运行所在的计算机的攻击者的参数,那么您遇到了更大的麻烦。


1

如果你真的不能使用SSL,我会建议一个预先共享的密钥方法,并添加一个随机的iv。

你可以使用任何体面的对称加密方法,如前。 AES使用您在带外(电子邮件,电话等)进行通信的预共享密钥。

然后你生成一个随机初始化向量,并用这个iv和密钥加密你的字符串。最后你连接你的密文和iv,并把它作为你的参数。 iv可以在没有任何风险的情况下以清晰的方式传达。


2

可惜的是,几乎关注的是在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请求)也将以明文形式发送。您需要使用SSL并执行POST请求才能正确加密数据。

作为参数将被不管你用什么HTTP方法加密的评论中指出的,只要你使用SSL连接。

  0

这是正确的吗?当使用SSL/TLS时,我认为URL被加密为HTTP命令的参数(例如,GET,POST)。域以明文形式发送,但我认为其余部分在数据包的TLS部分内加密。 14 2月. 102010-02-14 19:53:16

+1

不正确。 DNS请求以明文发送。然后建立SSL隧道。然后HTTP请求 - 包括URI - 通过该隧道发送。 17 5月. 112011-05-17 14:23:17