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

Oracle Discussion :

[10gR2] Stockage de mots de passe


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 42
    Points
    42
    Par défaut [10gR2] Stockage de mots de passe
    Bonjour,

    Pour mon projet, je suis en train de creer une table UTILISATEURS dans ma BD permettant aux utilisateurs de s'identifier dans mon application.

    Je sais qu'il existe une fonction PASSWORD qui permet de chiffrer une chaine de caractères pour ensuite stocker le résultat dans une colonne d'une table.

    Je cherche mais je ne trouve pas d'infos sur cette fonction, à part pour tout ce qui touche l'administration d'Oracle, ce qui ne me concerne pas.

    J'aimerais donc savoir comment utiliser cette fonction à la création de ma table et également lors de requêtes. Quel type doit être utilisé dans la colonne qui stocke ces PASSWORD ? Du varchar2 ? Si oui, de combien de caractères ?

    Merci d'avance pour vos réponses !

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    dbms_objuscation_toolkit

    la fonction rechercher devrait faire le reste

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 42
    Points
    42
    Par défaut
    Merci

  4. #4
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Mieu avec le package DBMS_CRYPTO

    Ici, on va enchiffré le mot MOHAMMEDBOUAYOUN avec la clé ABCDEFGHIJKLMNOP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE
    	   chif_val VARCHAR2(200);
    BEGIN
    	DBMS_OBFUSCATION_TOOLKIT.des3encrypt
    		(input_string	=>	'MOHAMMEDBOUAYOUN',
    		 key_string		=>	'ABCDEFGHIJKLMNOP',
    		 encrypted_string => chif_val
    		 );
    	DBMS_OUTPUT.put_line('Valeur enchiffré = '|| chif_val);
    END;
    Le resultat de la requête n'est pas interessante pour la stocker ou l'imprimer
    Valeur enchiffré = â4u*¿Nc
    ä§)^Sóq
    Alors, on utilise le package UTL_RAW pour convertir la valeur en type de données RAW, puis on convert le resultat en Hexadecimal avec la fonction RAWTOHEX.
    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
     
    DECLARE
    	   chif_val VARCHAR2(200);
    BEGIN
    	DBMS_OBFUSCATION_TOOLKIT.des3encrypt
    		(input_string	=>	'MOHAMMEDBOUAYOUN',
    		 key_string		=>	'ABCDEFGHIJKLMNOP',
    		 encrypted_string => chif_val
    		 );
    	chif_val := RAWTOHEX(UTL_RAW.cast_to_raw(chif_val));
    	DBMS_OUTPUT.put_line('Valeur enchiffré = '|| chif_val);
    END;
     
     
    Valeur enchiffré = E23475AD8A4E630A81E4A7295E53F371
    On peut aussi convertir la valeur enchiffré de l'Hexadecimal en valeur numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chif_val := to_number('E23475AD8A4E630A81E4A7295E53F371','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
     
    Valeur enchiffré = 300677913275234235803498582057300521841
    Dans les exemple precedentes on'a utilisé la fonction DES3ENCRYPT qui est un triple enchiffrement DES. On peut utiliser d'autres fonctions

    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
     
    CREATE OR REPLACE FUNCTION get_enc_val (p_in_val IN VARCHAR2, p_key IN VARCHAR2)
           RETURN VARCHAR2
        IS
           l_enc_val   VARCHAR2 (200);
        BEGIN
           l_enc_val :=
           DBMS_OBFUSCATION_TOOLKIT.des3encrypt (input_string      => p_in_val,
                                                 key_string        => p_key
                                                 );
           l_enc_val := RAWTOHEX (UTL_RAW.cast_to_raw (l_enc_val));
           RETURN l_enc_val;
        END;
     
    DECLARE
            v_enc   VARCHAR2 (200);
         BEGIN
            v_enc := get_enc_val ('MOHAMMEDBOUAYOUN', 'ABCDEFGHIJKLMNOP');
            DBMS_OUTPUT.put_line ('Encrypted value = ' || v_enc);
         END;
          /
    Encrypted value = E23475AD8A4E630A81E4A7295E53F371
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
            v_enc   VARCHAR2 (200);
         BEGIN
            v_enc := get_enc_val ('MOHAMMEDBOUAYOUN1', 'ABCDEFGHIJKLMNOP');
            DBMS_OUTPUT.put_line ('Encrypted value = ' || v_enc);
         END;
          /
     
    ORA-28232: invalid input length for obfuscation toolkit
    ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 0
    ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 216
    ORA-06512: at "SYSTEM.GET_ENC_VAL", line 6
    ORA-06512: at line 4
    On a cette erreur, car l'entrée de la fonction DES3ENCRYPT doit être un multiple de 8 caractères, ce type de enchiffrement est connu sous le nom de block ciphering, pour remidier à ce problème, on écrit une autre fonction qui ajoute des espaces pour que la longeur de l'entrée soit un multiple de 8

    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
     
    CREATE OR REPLACE FUNCTION get_enc_val (p_in_val IN VARCHAR2, p_key IN VARCHAR2)
           RETURN VARCHAR2
        IS
           l_enc_val   VARCHAR2 (200);
    	   l_in_val	   VARCHAR2 (200);
        BEGIN
    	   l_in_val := RPAD(p_in_val,(8*ROUND(LENGTH(p_in_val)/8,0)+8));
           l_enc_val :=
              DBMS_OBFUSCATION_TOOLKIT.des3encrypt (input_string      => l_in_val,
                                                    key_string        => p_key
                                                   );
           l_enc_val := RAWTOHEX (UTL_RAW.cast_to_raw (l_enc_val));
           RETURN l_enc_val;
        END;
     
    DECLARE
            v_enc   VARCHAR2 (200);
         BEGIN
            v_enc := get_enc_val ('MOHAMMEDBOUAYOUN1', 'ABCDEFGHIJKLMNOP');
            DBMS_OUTPUT.put_line ('Encrypted value = ' || v_enc);
         END;
          /
    Encrypted value = E23475AD8A4E630A81E4A7295E53F371DC94046D7D5747F8
    Avec la package DBMS_CRYPTO dans Oracle 10g, on a pas besoin d'ajouter des espaces, ca se fait automatiquement.

    Tu a les algorithmes suivant
    ENCRYPT_DES (56 bit)
    ENCRYPT_3DES_2KEY (128 bit)
    ENCRYPT_3DES
    ENCRYPT_AES128 (128 bit)
    ENCRYPT_AES192 (192 bit)
    ENCRYPT_AES256 (256 bit)
    ENCRYPT_RC4 (Stream Cipher)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DBMS_CRYPTO.encrypt(
           src in raw,
           typ in pls_integer,
           key in raw,
           iv  in raw          default null)
         return raw;
    avec

    src : la valeur à chiffré
    typ : type de chiffrement
    iv : vecteur d'initialisation

    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
     
        CREATE OR REPLACE FUNCTION get_enc_val (
           p_in_val      IN   VARCHAR2,
           p_key         IN   VARCHAR2,
           p_algorithm   IN   VARCHAR2 := 'AES128',
           p_iv          IN   VARCHAR2 := NULL
        )
           RETURN VARCHAR2
        IS
           l_enc_val    RAW (4000);
           l_enc_algo   PLS_INTEGER;
           l_in         RAW (4000);
           l_iv         RAW (4000);
           l_key        RAW (4000);
           l_ret        VARCHAR2 (4000);
        BEGIN
           l_enc_algo :=
              CASE p_algorithm
                 WHEN 'DES'
                    THEN DBMS_CRYPTO.encrypt_des
                 WHEN '3DES_2KEY'
     
                    THEN DBMS_CRYPTO.encrypt_3des_2key
                 WHEN '3DES'
                    THEN DBMS_CRYPTO.encrypt_3des
                 WHEN 'AES128'
                    THEN DBMS_CRYPTO.encrypt_aes128
                 WHEN 'AES192'
                    THEN DBMS_CRYPTO.encrypt_aes192
                 WHEN 'AES256'
                    THEN dbms_crypto.encrypt_aes256
                 WHEN 'RC4'
                    THEN DBMS_CRYPTO.encrypt_rc4
              END;
           l_in := utl_i18n.string_to_raw (p_in_val, 'AL32UTF8');
           l_iv := utl_i18n.string_to_raw (p_iv, 'AL32UTF8');
           l_key := utl_i18n.string_to_raw (p_key, 'AL32UTF8');
           l_enc_val :=
              DBMS_CRYPTO.encrypt (src      => l_in,
                                   KEY      => l_key,
                                   iv       => l_iv,
                                   typ      =>   l_enc_algo
                                               + DBMS_CRYPTO.chain_cbc
                                               + DBMS_CRYPTO.pad_pkcs5
                                  );
           l_ret := RAWTOHEX (l_enc_val);
           RETURN l_ret;
        END;
    Après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        SQL> SELECT get_enc_val ('Test','1234567890123456')
          2>   FROM dual
          3> /
     
        GET_ENC_VAL('TEST','1234567890123456')
        --------------------------------------
        2137F30B29BE026DFE7D61A194BC34DD

    un exemple pour chiffrer et decrypter

    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
     
      REM
            REM Define a variable to hold the encrypted value
     
            VARIABLE enc_val varchar2(2000);
            DECLARE
               l_key          VARCHAR2 (2000) := '1234567890123456';
               l_master_key   VARCHAR2 (2000) := '&master_key';
               l_in_val       VARCHAR2 (2000) := 'Confidential Data';
               l_mod          NUMBER
                  :=   DBMS_CRYPTO.encrypt_aes128
                    + DBMS_CRYPTO.chain_cbc
                    + DBMS_CRYPTO.pad_pkcs5;
              l_enc          RAW (2000);
              l_enc_key      RAW (2000);
           BEGIN
              l_enc_key :=
                 UTL_RAW.bit_xor (utl_i18n.string_to_raw (l_key, 'AL32UTF8'),
                                  utl_i18n.string_to_raw (l_master_key, 'AL32UTF8')
                                 );
              l_enc :=
                 DBMS_CRYPTO.encrypt (utl_i18n.string_to_raw (l_in_val, 'AL32UTF8'),
                                      l_mod,
                                      l_enc_key
                                     );
              DBMS_OUTPUT.put_line ('Encrypted=' || l_enc);
              :enc_val := RAWTOHEX (l_enc);
           END;
           /
           DECLARE
              l_key          VARCHAR2 (2000) := '1234567890123456';
              l_master_key   VARCHAR2 (2000) := '&master_key';
              l_in_val       RAW (2000)      := HEXTORAW (:enc_val);
              l_mod          NUMBER
                 :=   DBMS_CRYPTO.encrypt_aes128
                    + DBMS_CRYPTO.chain_cbc
                    + DBMS_CRYPTO.pad_pkcs5;
              l_dec          RAW (2000);
              l_enc_key      RAW (2000);
           BEGIN
              l_enc_key :=
                 UTL_RAW.bit_xor (utl_i18n.string_to_raw (l_key, 'AL32UTF8'),
                                  utl_i18n.string_to_raw (l_master_key, 'AL32UTF8')
                                 );
              l_dec := DBMS_CRYPTO.decrypt (l_in_val, l_mod, l_enc_key);
              DBMS_OUTPUT.put_line ('Decrypted=' || utl_i18n.raw_to_char (l_dec));
          END;
    Donc pour resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        Enter value for master_key: MasterKey0123456
        old   3:     l_master_key varchar2(2000) := '&master_key';
        new   3:     l_master_key varchar2(2000) := 'MasterKey0123456';
        Encrypted=C2CABD4FD4952BC3ABB23BD50849D0C937D3EE6659D58A32AC69EFFD4E83F79D
     
     
        PL/SQL procedure successfully completed.
     
        Enter value for master_key: MasterKey0123456
        old   3:     l_master_key varchar2(2000) := '&master_key';
        new   3:     l_master_key varchar2(2000) := 'MasterKey0123456';
        Decrypted=ConfidentialData
    Peut être un article à developper.

  5. #5
    Membre chevronné Avatar de denisys
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 138
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par bouyao
    Peut être un article à developper.
    Absolument !!!
    Surtout avec toutes les polémiques concernant la sécurité des données et principalement de oracle .
    C’est un article qui serais le bien venue !!!!

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut Regles du Forum
    Citation Envoyé par hotkebab99
    Merci
    Peut être bouton en bas à gauche alors

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par bouyao
    Peut être un article à developper.
    Non... un article pour Developpez


  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 42
    Points
    42
    Par défaut
    Merci de vos réponses et content d'avoir lancé ce projet d'article !

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

Discussions similaires

  1. Bonne pratique de stockage de mot de passe
    Par CacaoSunrise dans le forum Sécurité
    Réponses: 5
    Dernier message: 21/03/2013, 14h10
  2. Stockage de mots de passe : cryptage ou pas ?
    Par StringBuilder dans le forum Autres
    Réponses: 9
    Dernier message: 12/07/2012, 11h00
  3. Stockage des mots de passe de connexion
    Par marcusien dans le forum Entity Framework
    Réponses: 1
    Dernier message: 08/09/2011, 12h19
  4. [Sécurité] Stockage des mots de passe
    Par Jesmar dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2007, 21h05
  5. stockage de mot de passe. ASP contre md5
    Par christel1982 dans le forum ASP
    Réponses: 15
    Dernier message: 02/12/2005, 08h45

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