2013-06-19 3 views
1

Я пытаюсь зашифровать пароль, отправленный клиентской стороной, с помощью Javascript's CryptoJS и расшифровать его на стороне сервера с использованием класса Cipher Java.Защита паролем AES с использованием CryptoJS на клиенте и шифрования Java на сервере

На стороне клиента:

<html> 
<body> 
    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
    <script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script> 
    <script> 
     var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); 
     var encrypted = CryptoJS.AES.encrypt("A Sample Message", "SecretPassphrase", { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding, iv: iv }); 
     console.log("iv: " + encrypted.iv.toString(CryptoJS.enc.Hex)); 
     console.log("ct: " + encrypted.ciphertext.toString(CryptoJS.enc.Hex)); 
    </script> 
</body> 
</html> 

Выход я получаю на Firebug является

iv: a43e384b24e275c29a8a68bc031fd79e 
ct: c86b6ca4ef30fadfea28821e04aa8dad 

На стороне сервера:

import java.nio.charset.Charset; 
import java.security.*; 
import javax.crypto.*; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.*; 

public class AES { 

    public static String decrypt(String encryptedData) throws Exception { 
     byte[] keyBytes = "SecretPassphrase".getBytes(); 
     Key key = new SecretKeySpec(keyBytes, "AES"); 

     Cipher c = Cipher.getInstance(ALGO); 

     byte[] iv = (byte[]) new Hex().decode("a43e384b24e275c29a8a68bc031fd79e"); 
     IvParameterSpec ivspec = new IvParameterSpec(iv); 
     c.init(Cipher.DECRYPT_MODE, key, ivspec); 

     byte[] decordedValue = (byte[]) new Hex().decode(encryptedData); 
     byte[] decValue = c.doFinal(decordedValue); 

     String decryptedValue = Hex.encodeHexString(decValue); 
     return decryptedValue; 
    } 

    public static void main(String[] args) throws Exception { 
     String result = AES.decrypt("c86b6ca4ef30fadfea28821e04aa8dad"); 
     System.out.println(hexToString(result)); 
    } 
} 

мне нужна помощь о том, что я я делаю неправильно и почему я получаю случайно iv на моем clien t, когда я ограничиваю его использование прошедшего iv.

+0

_Do не шифровать пароли_. Вам необходимо ** хэш ** пароли, используя bcrypt или scrypt или PBKDFv2. – SLaks

+1

Кроме того, криптография на стороне клиента не добавит никакой безопасности в большинстве случаев. В частности, от необходимости SSL не избежать. – SLaks

+0

На самом деле мне нужен открытый текст пароля для соответствия моей базе данных. –

ответ

2

Вы передаете кодовую фразу вместо ключа на стороне клиента. Таким образом, он будет делать вывод ключа OpenSSL, возможно, создавая внутри него.

Выполнение SecretPassphrase".getBytes() - это то, что вы никогда не должны делать. Используйте hexadecimals, если вы хотите, чтобы ваш текст был текстовым, и преобразовать его в двоичное, используя шестнадцатеричное декодирование.