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

は私が準備ライブラリを見つけることができ波平このシンプルかつ通常のタスクのために、私はこの(this was the source)を書いてしまった、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); 
} 

}


0

HTTPトラフィックを暗号化する標準的な方法は、SSLを使用することです。 しかし、HTTPSを使用しても、URLとその中のパラメータ(つまりGETリクエスト)は明確に送信されます。データを適切に暗号化するには、SSLを使用してPOST要求を行う必要があります。

としては、パラメータは限り、あなたはSSL接続を使用するように、あなたが使用しているものHTTPメソッドに関係なく、暗号化されませんコメントで指摘しました。

  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