Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的URL加密_Url_Encryption - Fatal编程技术网

Java中的URL加密

Java中的URL加密,url,encryption,Url,Encryption,在Java中,用参数加密URL的最佳方法是什么?您确定不是指URL编码吗 编码可以通过java.net.URLEncoder.encodejava安全api()+url编码来实现。唯一的方法是使用SSL/TLS(https)。如果您使用普通的旧HTTP,URL肯定会以明文形式发送。这取决于您的威胁模型。例如,如果您想保护java应用程序从攻击者访问您的服务器的参数,您可以考虑通过TLS/SSL(即,在您的情况下,HTTPS)和类似的方式与服务器进行通信。如果您想保护参数不受攻击者的攻击,攻击者可

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

您确定不是指URL编码吗


编码可以通过
java.net.URLEncoder.encode

java安全api()+url编码来实现。唯一的方法是使用SSL/TLS(https)。如果您使用普通的旧HTTP,URL肯定会以明文形式发送。

这取决于您的威胁模型。例如,如果您想保护java应用程序从攻击者访问您的服务器的参数,您可以考虑通过TLS/SSL(即,在您的情况下,HTTPS)和类似的方式与服务器进行通信。如果您想保护参数不受攻击者的攻击,攻击者可以访问Java客户端应用程序运行的机器,那么您将面临更大的麻烦。

如果您确实无法使用SSL,我建议采用预共享密钥方法并添加随机iv

您可以使用任何像样的对称加密方法,例如AES,使用带外通信(电子邮件、电话等)的预共享密钥


然后生成一个随机初始化向量,并用这个iv和密钥加密字符串。最后,将密文和iv连接起来,并将其作为参数发送。iv可以清晰地传达,没有任何风险。

不幸的是,java中几乎没有简单的东西:-),对于这个简单而常见的任务,我没有找到一个准备好的库,我最后写了这个():


}加密HTTP通信的标准方法是使用SSL。但是,即使通过HTTPS,URL和其中的任何参数(即GET请求)也将以明文形式发送。您需要使用SSL并执行POST请求来正确加密数据


正如注释中所指出的,无论您使用何种HTTP方法,只要您使用SSL连接,参数都将被加密。

您能更具体一点吗?是这样吗?当使用SSL/TLS时,我认为URL是作为HTTP命令的参数加密的(例如GET、POST)。域以明文形式发送,但我认为其余部分在数据包的TLS部分中加密。不是这样。DNS请求以明文形式发送。然后建立一个SSL隧道。然后HTTP请求(包括URI)通过该隧道发送。
 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);
}