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

PostgreSQL Discussion :

[PL/pgSQL] Obfuscation nombre dans chaine 32 caractères


Sujet :

PostgreSQL

  1. #1
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut [PL/pgSQL] Obfuscation nombre dans chaine 32 caractères
    Bonjour,

    Je voudrais transformer la clé primaire d'une table (SERIAL) en chaine de 32 caractères. Je pourrais simplement prendre la valeur héxa, mais je me retrouverais au début avec plein de 0 au début de mes chaînes.

    Ce n'est pas une donnée sensible, mais simplement parce que j'ai besoin d'un id de taille fixe pour échanger avec un autre système.

    La manœuvre doit être parfaitement réversible bien entendu.

    Merci pour votre aide.

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Une simple conversion de type en VARCHAR(32) ou compléter le nombre de caractères par des 0 (zéro) à la fin ou au début.
    @+

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Regarde peut être du côté du UUID Type.

    Mais ça n'a rien de réversible, plutôt à rajouter en plus de la colonne serial.

  4. #4
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    Je ne veux justement pas compléter avec des 0.
    Par contre, j'ai trouvé un solution convenable : mon id codé en Base64 précédé par un tiret, et je complète avec des caractères aléatoires (ne comprenant pas le tiret bien sûr).

    La valeur utile est donc facilement récupérable.

    Merci pour l'aide.

  5. #5
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    J'ai fini par le faire en php.
    32 caractères ça faisait beaucoup, alors là je crée une chaîne de longueur fixée à 18 caractères.
    Cela obfusque la clé primaire récupérée dans la base de données.
    Je peux ainsi envoyer un mail pointant vers une ressource désignée par son id.

    Voici mon code avec fonction de test :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    function base64url_encode($data) {
      return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }
     
    function base64url_decode($data) {
      return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
    }
     
    function test($data){
    	// Affichage de la valeur de départ.
    	echo $data . " = ";
    	// Nombre aléatoire et tiret en préfixe de notre valeur utile.
    	$data = str_pad(strval(mt_rand(0, 999999)), 6, '0', STR_PAD_LEFT) . "-" . $data;
     
    	// Encodage et affichage de nos données.
    	$data = base64url_encode($data);
    	echo $data . " = ";
     
    	// Décodage et affichage pour vérification de la réversibilité de l'algorithme.
    	$data = base64url_decode($data);
    	$data = substr(stristr($data, "-"), 1);
    	echo $data . "<br />\n";
    }
     
    for ($i = 0; $i < 25; $i++){
    	$number = strval($i);
    	test(str_pad($number, 6, '0', STR_PAD_LEFT));
    }
    for ($i = 0; $i < 25; $i++){
    	$number = strval(mt_rand(0, 999999));
    	test(str_pad($number, 6, '0', STR_PAD_LEFT));
    }
    ?>

    Résultat possible (il y a une partie aléatoire, ne l'oubliez pas ) :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    000000 = NTk2NDM5LTAwMDAwMA = 000000
    000001 = NDUyODE3LTAwMDAwMQ = 000001
    000002 = MTg2NjE5LTAwMDAwMg = 000002
    000003 = MjYyMTEwLTAwMDAwMw = 000003
    000004 = Njc1NjYzLTAwMDAwNA = 000004
    000005 = MTg0NTU1LTAwMDAwNQ = 000005
    000006 = ODg5NDM2LTAwMDAwNg = 000006
    000007 = OTUzNDkzLTAwMDAwNw = 000007
    000008 = MTE5MDMyLTAwMDAwOA = 000008
    000009 = NzY2NTE3LTAwMDAwOQ = 000009
    000010 = NjMyOTkxLTAwMDAxMA = 000010
    000011 = NzM2Mjg4LTAwMDAxMQ = 000011
    000012 = MDg5MzQ2LTAwMDAxMg = 000012
    000013 = OTkyMTY3LTAwMDAxMw = 000013
    000014 = MTM5MzMzLTAwMDAxNA = 000014
    000015 = MzExNzY5LTAwMDAxNQ = 000015
    000016 = ODA1NTYyLTAwMDAxNg = 000016
    000017 = MTYxNDA3LTAwMDAxNw = 000017
    000018 = ODUxMjg3LTAwMDAxOA = 000018
    000019 = MjI1OTA0LTAwMDAxOQ = 000019
    000020 = NzY2MzEzLTAwMDAyMA = 000020
    000021 = MDQyNDk5LTAwMDAyMQ = 000021
    000022 = MTEyODg5LTAwMDAyMg = 000022
    000023 = OTMyMzkyLTAwMDAyMw = 000023
    000024 = OTQ2Nzg1LTAwMDAyNA = 000024
    540315 = ODQwNDQ5LTU0MDMxNQ = 540315
    715254 = NTU5Mjk0LTcxNTI1NA = 715254
    432053 = NTUzMDkxLTQzMjA1Mw = 432053
    580677 = MDI2NjIyLTU4MDY3Nw = 580677
    991441 = MjkwNDEyLTk5MTQ0MQ = 991441
    454132 = NjgxNTA0LTQ1NDEzMg = 454132
    635291 = ODYzNzc5LTYzNTI5MQ = 635291
    078733 = NDQ4ODE4LTA3ODczMw = 078733
    368244 = ODUzODY5LTM2ODI0NA = 368244
    038134 = NDE5ODU2LTAzODEzNA = 038134
    372465 = NTMzMTExLTM3MjQ2NQ = 372465
    304726 = MzQwMjU3LTMwNDcyNg = 304726
    524108 = NjQ4MzA5LTUyNDEwOA = 524108
    662017 = NjY3Mjg2LTY2MjAxNw = 662017
    251628 = NjI3NTIzLTI1MTYyOA = 251628
    166350 = NzcwNTEwLTE2NjM1MA = 166350
    058108 = MTE0NDQxLTA1ODEwOA = 058108
    737623 = MjUxOTU4LTczNzYyMw = 737623
    370857 = OTg0OTY4LTM3MDg1Nw = 370857
    706940 = MDEzMTAwLTcwNjk0MA = 706940
    333426 = MDE3NDExLTMzMzQyNg = 333426
    455433 = NDk3NDc3LTQ1NTQzMw = 455433
    849269 = OTk3Mzc2LTg0OTI2OQ = 849269
    357247 = MTY4NzA3LTM1NzI0Nw = 357247
    003778 = NjM1MjIyLTAwMzc3OA = 003778
    J'espère que cela pourra servir à quelqu'un d'autre

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

Discussions similaires

  1. [AC-2003] Rechercher nombre dans chaine de caractères
    Par benmacker dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 11/06/2009, 23h41
  2. Extraction dans chaine de caractères variable
    Par ginkas31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/08/2007, 17h27
  3. conversion dun nombre en chaine de caractère?
    Par franco82 dans le forum C++
    Réponses: 8
    Dernier message: 30/11/2006, 19h05
  4. Recherche de texte dans chaine de caractère
    Par Requin15 dans le forum Oracle
    Réponses: 13
    Dernier message: 14/09/2006, 12h10
  5. Réponses: 18
    Dernier message: 27/06/2006, 18h37

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