Talend Encryption (fonctions JAVA et PHP)

Si vous cherchez à crypter et décrypter des informations (ex: mot de passe) en utilisant les technologies JAVA et PHP alors bonne nouvelle! Vous êtes sur la bonne page!

Il m’est arrivé plusieurs fois de devoir lire des mots de passe avec Talend (en JAVA) dans une base de données. Tout programmeur sait qu’on NE STOCK JAMAIS un mot de passe en clair dans une base de données. En général on utilise un hash du mot de passe qui nous permet de comparer les mots de passes sans les connaitre. Ces algorithmes sont unidirectionnel et il est donc impossible de retrouver le mot original (sauf si l’on essaye le brute force avec une table de hash, mais bon cela est très compliqué et n’a pas énormément de chance de succès)

Dans mon cas le problème est qu’il s’agit de mot de passe que l’on doit pouvoir décrypter (ex: mot de passe SMTP, FTP, …), on parle bien de Cryptage et Décryptage et non pas de hachage.

Le tout étant géré par une IHM en PHP, il faut que le PHP encrypt et que la fonction JAVA décrypte. L’algorithme que j’ai choisi pour cela est Blowfish.

 

1. Encryption coté PHP avec BlowFish

Voici une classe statique permettant de crypter et de décrypter des données avec l’algorithme BlowFish. Les méthodes utilisent les librairies Mcrypt, il vous faudra donc activer cette extension si ce n’est pas déjà le cas (très rare dans une installation par défaut).

<?php
/**
 * BlowFishEncrypter
 * @see: http://www.developpez.net/forums/d649031/java/general-java/apis/securite/blowfish-php-java/
 */
class BlowFishEncrypter {

  public static function encryptBlowfish($cleartext, $key = null)
  {
    $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($cipher));
    $iv = '00000000';

    // ajout du Padding.
    $cleartext_length = strlen($cleartext) % 8;
    for ($i = $cleartext_length; $i < 8; $i++)
    {
      $cleartext .= chr(8 - $cleartext_length);
    }

    $cipherText = '';
    // 128-bit blowfish encryption:
    if (mcrypt_generic_init($cipher, $key, $iv) != -1)
    {
      // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
      $cipherText = mcrypt_generic($cipher, $cleartext);
      mcrypt_generic_deinit($cipher);
    }

    return base64_encode($cipherText);
  }

  public static function decryptBlowfish($encrypted, $key = null)
  {

    $encrypted = base64_decode($encrypted);

    $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($cipher));
    $iv = '00000000';

    // 128-bit blowfish encryption:
    if (mcrypt_generic_init($cipher, $key, $iv) != -1)
    {
      // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
      $cleartext = mdecrypt_generic($cipher, $encrypted);
      mcrypt_generic_deinit($cipher);
    }

    // suppression du padding.
    $pad = ord(substr($cleartext, strlen($cleartext) - 1));
    if ($pad > 0 & $pad <= 8)
    {
      $cleartext = substr($cleartext, 0, strlen($cleartext) - $pad);
    }

    return $cleartext;
  }

}

 

 2. Encryption coté JAVA avec BlowFish

Voici son homologue en java, une fonction qui cryte et décrypte en JAVA. Vous pouvez utiliser ces fonctions dans Talend par exemple afin de récupérer des mots de passe pour un composant (ex: tFTP, tSSH,…) que vous auriez stocké dans une base de données depuis une IMH en PHP.

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * BlowFishEncrypter
 * @see: http://www.developpez.net/forums/d649031/java/general-java/apis/securite/blowfish-php-java/
 */
public class BlowFishEncrypter {

	public static String encryptBlowfish(String data, String Key) {

		try {

			String iv = "00000000";
			IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
			SecretKey secretKey = new SecretKeySpec(Key.getBytes(), "Blowfish");

			Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivs);

			BASE64Encoder enc = new BASE64Encoder();

			byte[] encoded = cipher.doFinal(data.getBytes());
			return enc.encode(encoded);
		} catch (Exception e) {
			System.out.println(e);
		}
		return null;

	}

	public static String decryptBlowfish(String data, String Key) {

		try {

			BASE64Decoder dec = new BASE64Decoder();
			byte[] decoded = dec.decodeBuffer(data);

			String iv = "00000000";
			IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());

			SecretKey secretKey = new SecretKeySpec(Key.getBytes(), "Blowfish");

			Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, secretKey, ivs);
			return new String(cipher.doFinal(decoded), "UTF8");
		} catch (Exception e) {
			System.out.println(e);
		}
		return null;

	}
}

 

Voila! Ces fonctions vont vous permettre de crypter et décrypter librement des deux cotés : Java et PHP, en transitant par une base de données par exemple.

__________________

One comment

  1. Bonjour, Merci infiniment.

    Il faut juste mentionner que n’est pas reconnu par eclipse.

    bonne continuation.

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>