jan 23 2008

Cryptographie java, les certificats X509

Tag: Développement, J2EEkarl verger @ 21:41

Bon pour ce soir on vas voir la création de certificats X509 et leur sauvegarde dans un keystore.

wikipedia : Un certificat électronique est une carte d’identité numérique dont l’objet est d’identifier une entité physique ou non-physique. Le certificat numérique ou électronique est un lien entre l’entité physique et l’entité numérique (Virtuel). L’autorité de certification fait foi de tiers de confiance et atteste du lien entre l’identité physique et l’entité numérique. Le standard le plus utilisé pour la création des certificats numérique est le X.509.

Il existe 4 types de certificats en fonction du niveau de sécurité:

  • classe 1: adresse e-mail du demandeur requise;
  • classe 2: preuve de l’identité requise (photocopie de carte d’identité par exemple);
  • classe 3: présentation physique du demandeur obligatoire.
  • classe 3+: identique à la classe 3, mais le certificat est stocké sur un support physique (clé USB à puce, ou carte à puce; exclut donc les certificats logiciels)

Tel qu’on l’utilise en cryptographie et en sécurité informatique, un certificat électronique est un bloc de données contenant, dans un format spécifié, les parties suivantes :

  • un numéro de série;
  • l’identification de l’algorithme de signature;
  • la désignation de l’autorité de certification émettrice du certificat;
  • la période de validité au-delà de laquelle il sera suspendu ou révoqué;
  • le nom du titulaire de la clé publique;
  • l’identification de l’algorithme de chiffrement et la valeur de la clé publique constitué d’une paire de clés asymétriques (comme par exemple RSA);
  • des informations complémentaires optionnelles;
  • l’identification de l’algorithme de signature et la valeur de la signature numérique.

Voila pour la définition, il faut savoir qu’au sein du kesytore nous pouvons stocker un certificat avec sa clef publique et y associer sa clef privé afin de pouvoir l’exploiter dans le cadre de la signature électronique ou de l’encryption de documents.

Il est important de noter aussi qu’en fonction de l’usage prévu pour un certificat (horodatage, signature de code, authentification server, email etc…) il est nécessaire de le spécifier, voir exemple 4 de cet article -> création d’un certificat permettant la création de jeton d’horodatage.

Nous allons donc créer notre paire de clefs public / privé, notre certificat et l’ajouter à notre keystore

1 Création de la paire de clefs

    public static KeyPair generateKeyPair() throws CryptoException
    {
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
            keyPairGen.initialize(2048, rand);
            KeyPair keyPair = keyPairGen.generateKeyPair();

            return keyPair;
        }
        catch (NoSuchAlgorithmException ex) {
            throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
        }
        catch (InvalidParameterException ex) {
            throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
        }
    }

2 Creation du certificat de type X509 V1

Continue reading “Cryptographie java, les certificats X509″


jan 22 2008

Cryptographie java, les keystores

Tag: Développement, J2EEkarl verger @ 21:37

Bien hier nous avons vu comment générer des clef symétrique AES et des clefs asymétriques RSA et comment les utiliser pour réaliser un cryptage décryptage avec ces clefs.

Ce soir nous allons aborder la gestion des keystores (création, sauvegarde, chargement, ajout de certificat), les keystore servent à stocker vos certificats et clefs, pour l’exemple on ne traite que les keystores PKCS#12

wikipedia : Les PKCS (Public Key Cryptographic Standards), ou standards de cryptographie à clé publique, sont un ensemble de spécifications conçues par les laboratoires RSA en Californie. La société RSA Security est spécialisée dans les solutions de sécurité cryptographiques. Elle est également propriétaire de licences d’exploitations de plusieurs algorithmes (dont RSA avant l’expiration de son brevet le 21 septembre 2000). C’est pour ces raisons que la société a développé et promu les PKCS, permettant l’implantation des techniques de cryptographie à clé publique.

La société RSA Security n’est pas un organisme de normalisation et contrôle complètement l’élaboration et l’évolution des PKCS. L’appellation des PKCS comme standards au sens strict est donc abusive. Répondant à un réel besoin technique, les PKCS ont néanmoins été très largement adoptés par le milieu informatique. Le groupe de travail PKIX de l’IETF a depuis reformulé certains des PKCS dans des RFC, les standards Internet. L’abus de langage confondant le PKCS au lieu de la RFC correspondante est très répandu.

CS#12 1.0 Standard de syntaxe d’information personnelle Définit un format de fichier généralement utilisé pour stocker la clé privée et le certificat de clé publique correspondant en les protégeant par un mot de passe.

1 Créer un keystore de manière programmatique

    public static KeyStore createKeyStorePKCS12() throws CryptoException{
        try {
            KeyStore keyStore = null;
            keyStore = KeyStore.getInstance("PKCS12", "BC");
            keyStore.load(null, null);
            return keyStore;
        } catch (IOException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème IO : "+ex.getMessage());
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème d'algo : "+ex.getMessage());
        } catch (CertificateException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème de certificat : "+ex.getMessage());
        } catch (KeyStoreException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème sur le keystore : "+ex.getMessage());
        } catch (NoSuchProviderException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème de provider : "+ex.getMessage());
        }
    }

Continue reading “Cryptographie java, les keystores”


jan 21 2008

Cryptographie java, clef AES et RSA

Tag: Développement, J2EEkarl verger @ 21:29

Bon allez, une petite série dans la continuité des articles sur la signature électronique, on vas faire un petit tours rapide de la crypto symétrique et asymétrique avec java.

1 Encryption avec une clef symétrique AES

wikipédia : Le standard de chiffrement avancé (Advanced Encryption Standard ou AES) est un algorithme de chiffrement symétrique, choisi en octobre 2000 par le NIST pour être le nouveau standard de chiffrement pour les organisations du gouvernement des États-Unis.

générer une clef symétrique AES

    public static SecretKey generateKeyAES128() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);
        return keyGen.generateKey();
    }

puis crypter avec cette clef secrète AES

    public static byte[] cryptWithAES(byte[] plaintext, byte[] bytesKey) throws CryptoException {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(bytesKey, "AES"));
            byte[] encrypted = cipher.doFinal(plaintext);
            return encrypted;
        } catch (NoSuchAlgorithmException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (NoSuchPaddingException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (InvalidKeyException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (IllegalBlockSizeException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (BadPaddingException ex) {
            throw new CryptoException(ex.getMessage());
        }
    }

Continue reading “Cryptographie java, clef AES et RSA”


déc 11 2007

Présentation de Apache Lucene

Tag: Architecture, Développement, Idéeskarl verger @ 21:59

Présentation

Dans de nombreux systèmes d’informations, le SGBDR est utilisée comme moteur de recherche grâce à ses fonctions d’indexation. Cependant, cette technologie n’est pas à l’aise dès qu’il s’agit de faire des recherches partielles (un mot dans un titre), ses performances chutent et doivent être compensées par du matériel plus puissant. De plus, les possibilités fonctionnelles des SGBDR en terme de recherche sont très limitées : pas de recherche approximative ou phonétique, ou pas de tri des résultats par pertinence.
 

Lucene est un moteur de recherche Open-Source dont la première version publique en Java date de Mars 2000. Lucene a été originellement développé par Dough Cunning, spécialiste des technologies de recherche textuelle chez Xerox puis Apple. Depuis, Lucene a été developpé et largement adopté comme l’API standard pour les moteurs de recherche textuelle. Il a été porté dans une dizaine de langages et est utilisé dans des centaines de projets commerciaux et de sites web, parmi lesquels :

monster.fr
societe.com
wikipedia.com
sourceforge.net
et d’autre….

Lucene est basé sur une technologie d’indexation des contenus textuels similaire à Google ou d’autres moteurs de recherche. D’ailleurs, un sous-projet de Lucene, Nutch, offre les fonctionnalités de Google et permet de faire de la recherche sur des millions de pages web.

Lucene offre des performances inégalées et est scalable quelle que soit la volumétrie en terme de contenu ou de nombre de recherches. Lucene offre de nombreuses possibilités que l’on vas survoler ci-dessous :

Continue reading “Présentation de Apache Lucene”