IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Crypter 3DES Blowfish les data d'un SELECT formaté JSON?


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut Crypter 3DES Blowfish les data d'un SELECT formaté JSON?
    Salut les spécialistes!

    Coté Php, j'ai actuellement un select que je retourne en Json à mon device Android, ok!

    Pour éviter que les data renvoyées ne circulent en clair, on me demande de crypter cet envoi d'information vers Android.

    Pour le moment j'ai qq chose comme ça:

    script php principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                        $mysql_result = database_exec("select ID, NAME from TABLE1 order by ID");                                                
                        while($line=mysql_fetch_array($mysql_result))
                        {
                            $requete="select count(T2.ID) as nb
                                  from TABLE2 T2,
                                       TABLE3 T3
                                  where T2.COL = ".$var1."
                                        AND T2.COL = T3.COL";
                            $result=mysql_query($requete);
                            $ligne_nb=mysql_fetch_array($result);
     
                            if($ligne_nb["nb"] != 0)
                            {
                                $output[] = $ligne + $ligne_nb;
                            }
                        }
                        print(json_encode($output));
    fct de cryptage php (que j'utilise déjà par ailleurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function crypt2($cleartext, $key)
    {
        $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
        $key = substr($key, 0, mcrypt_enc_get_key_size($cipher));
        $iv = '00000000';
     
        // Padding.
        $cleartext_length = strlen($cleartext)%8;
        for($i=$cleartext_length; $i<8; $i++)
        {
            $cleartext .= chr(8-$cleartext_length);
        }
     
        $cipherText='';
     
        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);
    }
    Il faudrait donc que j'encrypte la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $output[] = $ligne + $ligne_nb;
    Problématique:
    -> évidemment, je voudrais ne coder que les data, et non les entêtes de colonnes, puisque j'en ai besoin coté Android pour récupérer les data
    -> ex: COLUMN=ID mais DATA=_8pNbgq[
    -> puis décoder coté Android pour récupérer mes data en clair

    1.) Mais est-ce seulement possible? Comment? Je triture mon json sans arriver à mes fins...

    2.) Ou faudrait-il encrypter à la volée tout l'array Json? Et dans ce cas, comment modifier ma fct php crypt2 ci-dessus, ainsi que la fct Java ci-dessous (toutes les 2 gérant des string, et non des arrays)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static String decrypt2Password(byte[] encrypted, String password) throws GeneralSecurityException 
    {
        SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes(), "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
        String iv = "00000000";
        IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivs);
        byte[] decrypted = cipher.doFinal(encrypted);
        //return decrypted.toString();
        return new String(decrypted);
    }
    Voilà, comme d'hab, tout avis éclairé sera bon à prendre.
    Merci.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais pourquoi s'embêter ?
    Utilise simplement "https".... C'est à la couche transport de chiffrer/déchiffrer (crypter n'existe pas en Français), pas à la couche applicative....

    Ou alors, j'ai loupé une étape....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    J'avais déjà soumis l'idée, mais quand tu bosses avec qq'un bloqué en "mode parano"...

    -> qd je dis "je voudrais" ce n'est pas un choix technique de ma part
    -> c'est un ordre reçu

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Les data ne doivent être décodées QUE par l'appli Android, et ne jamais être disponibles en clair sur le device, ce qui serait le cas en https, une fois le transport terminé.

    Enfin, bref je n'ai pas le choix quoi!

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Haaaa ben non....

    TLS (le transport de HTTPS) est au dessus de TCP... a aucun moment les données ne sont en "clair" dans la 'pile' TCP (seule partie commune à toutes les applications)...
    Les données ne sont déchiffrées que dans la partie "application" (juste avant le décodage HTTP), et donc dans la mémoire de l'application uniquement, exactement comme si le déchiffrage était fait manuellement....

    Heureusement, sinon on pourrait dire adieu à la PCI compliance pour tous les serveurs HTTPS ...

    La beauté de TLS est même de pouvoir démarrer le flux chiffré *au milieu* de la conversation (IMAP,POP,SMTP,Kerberos,...).



    Parce que là si j'ai bien compris, tu fais du chiffrage avec clé simple (fixe)... donc facilement attaquable avec du "texte connu" (le 'cracker' peut chiffrer une donnée connue, et donc, après plusieurs itérations, en déduire la clé).

    A moins de saler l'information bien entendu ^^

    Pour ce qui est de la stratégie de chiffrage (données seulement, ou tout le stream...) je serai partisan de tout encoder (plus simple à mettre en oeuvre, et facilement désactivable le temps du debug)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String encodedArray = EntityUtils.toString(responseEntity);
    String decodedArray = decode(encodedArray);
    JSONObject data = new JSONObject(decodedArray);
    Plus simple qu'appeler le "decode" à chaque fois qu'on récupère une property...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    C'est bien ce qu'il me semblait aussi (https), mais comme dit, impossible de discuter... donc...

    Pour le problème data/stream, effectivement CT aussi ma piste puisque je ne voyais pas comment aller toucher la structure du Json elle même.

    Mais là ou je bloque c'est là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    function crypt2($cleartext, $key)
    {
        $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 $cipherText;
         return base64_encode($cipherText);
    }
    -> adapter ça pour ne plus gérer de string en entrée ($cleartext), mais un array complet (print(cryptArray(json_encode($output)), $password).

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    heu.......... je crois que j'ai encore été chercher inutilement trop compliqué.....

    -> je pensais, à voir la tête de l'affichage obtenue, que le résultat d'un json_encode() était un array

    -> or il s'agit visiblement d'un string, d'après ce que j'ai pu trouver

    DONC finalement je n'ai rien à changer en fait.

    Right?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les valeurs d'un <select> multiple
    Par vg33 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/10/2005, 11h38
  2. Comment utiliser les Data Modelers
    Par mqsi dans le forum Rational
    Réponses: 2
    Dernier message: 18/10/2005, 12h28
  3. cacher les options d'un select
    Par soony dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2005, 10h05
  4. Formater les libelles dans un <select>
    Par ranx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 25/08/2005, 13h30
  5. Réponses: 15
    Dernier message: 21/06/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo