Заготовки для аутентификации.

1280px-SIGABA-patent

Постановка задачи.

Для реализации системы аутентификации пользователя необходимо подобрать реализации двух криптографических алгоритмов на Java и JavaScript:
алгоритм хеширования MD5(Message Digest 5);
симметричное блочное шифрование AES.

Реализация.

Для серверной стороны, в Java уже существует стандартное решение — Java Cryptography Extension( пакеты javax.crypto, javax.crypto.interfaces, javax.crypto.spec ), которые включены в J2SE 1.4 и более поздние.

Примеры использования.
Шифрование:


        //Encryption.
        String textKey = new String("Secret 128-b key");
        byte[] key = textKey.getBytes(Charset.forName("UTF-8"));

        byte[] initializationVector = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};

        String text = new String("Test AES");
        byte[] dataToSend = text.getBytes(Charset.forName("UTF-8"));

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(initializationVector));

        byte[] encryptedData = cipher.doFinal(dataToSend);

Дешифрование полученных данных:


        //Decryption.
        Cipher cipherReceive = Cipher.getInstance("AES/CBC/PKCS5Padding");

        SecretKeySpec secretKeySpecResive = new SecretKeySpec(key, "AES");

        cipherReceive.init(Cipher.DECRYPT_MODE, secretKeySpecResive, new IvParameterSpec(initializationVector));       

        byte[] data = cipherReceive.doFinal(encryptedData);

Функция хеширование для String:


    public static String md5Custom(String source) {
        MessageDigest messageDigest = null;
        byte[] digest = new byte[0];

        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(source.getBytes());
            digest = messageDigest.digest();
        } catch (NoSuchAlgorithmException e) {
            System.out.println("Алгоритм, передаваемый в getInstance() не существует ");
        }
        BigInteger bigInt = new BigInteger(1, digest);
        String md5Hex = bigInt.toString(16);

        while (md5Hex.length() < 32) {
            md5Hex = "0" + md5Hex;
        }
        return md5Hex;
    }

Для клиентской стороны, мною были выбраны две коллекции реализаций стандартных криптографических алгоритмов на языке JavaScript:
— Forge, New BSD License — допускает использование в проприетарном и коммерческом ПО;
CryptoJS, лицензия на основе New BSD License и The MIT License — разрешают использование в проприетарном и коммерческом ПО.

Обе библиотеки содержат реализации необходимых алгоритмов. Из-за лучшей документированности окончательный выбор сделан в пользу CryptoJS.

Пример использования.
Шифрование:


var key = CryptoJS.enc.Hex.parse('536563726574203132382d62206b6579');
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
var message = "Test AES";

var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv });
document.write("Encrypted AES: "+encrypted.ciphertext+"<br>");

var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv });
document.write("Decrypted AES: "+decrypted+"<br>");

Хэширование:


    var hashC = CryptoJS.MD5("qwerty");
    document.write( "Хэш MD5 crypto-js: "+hashC+"<br>");

Тестирование показало корректную работу реализаций на JavaScript в связке с реализациями на Java.

Полезные ссылки.
1. Официальная документация class MessageDigest, class Cipher.
2. Crypto JS.
2. Crypto JS tutorial for dummies.

Добавить комментарий