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

PyQt Python Discussion :

Créer une Base de données cryptées)


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 45
    Points
    45
    Par défaut Créer une Base de données cryptées)
    J’ai créé une base de données (mabase.db3) en utilisant le module (Sqlite3).et PyQt4 pour l’affichage des données sur un tableau.Jusque-là tout fonctionne bien (écriture,lecture, affichage)
    Mais quand j’ouvre mabase.db3 avec un éditeur de texte (win32pad, Word pad) j’obtiens des caractères suivis des données de ma base et donc ce n’estpas un fichier crypté (on peut y accéder de l’extérieur et tirer quelques données)
    Je veux savoir s’il y a un moyen de crypter les données et n’afficher que des caractères inconnus.

    Voici un code que j’ai trouvé sur ce forum.
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import sys
    import sqlite3
    import random
    from PyQt4 import QtCore, QtGui, QtSql 
    #############################################################################
    def creat():
        """ creation au hazard d'une chaine de caractere (taille de la chaine =8) """
        text=''
        for i in range(8):
            text+=chr(random.randint(65,123))
     
        return text
    def creabasesql(basesql):
        """créer une base sql composée de 100 chaines de caracteres tirées au hasard"""
        cnx = sqlite3.connect(basesql)
        cur = cnx.cursor()
        cur.execute("""drop table if exists 'matable' """)
        cur.execute("""create table 'matable' (num integer)""")
        try:
            for i in range(1, 101):
                cur.execute("""insert into 'matable' values(?)""", 
                                                    (creat(),))
            cnx.commit()
        except sqlite3.Error:
            cnx.rollback()
            print ("erreur: " , (unicode(err.args[0]),))
        cur.close()
        cnx.close()
     
    #############################################################################
    class MonModel(QtSql.QSqlRelationalTableModel):
        """permet au modèle de charger la table complète des données"""
        def select(self):
            results = QtSql.QSqlRelationalTableModel.select(self)
            while self.canFetchMore():
                self.fetchMore()
            return results
     
    #############################################################################
    class Vuetable(QtGui.QWidget):
        """fenêtre affichant une table d'une base de données SQL (sqlite3 ici)"""
     
        def __init__(self, basesql, table, parent=None):
            super(Vuetable, self).__init__(parent)
     
            # stocker les arguments
            self.basesql = basesql
            self.table = table
     
            # instructions pour la fenêtre
            self.resize(800, 600)
            self.setWindowTitle("table: %s de la base: %s" % (self.table, 
                                                                    self.basesql))
     
            # ouvrir une connexion avec la base de données 
            self.cnx = QtSql.QSqlDatabase.addDatabase("QSQLITE")
            self.cnx.setDatabaseName(self.basesql)
            if not self.cnx.open():
                QtGui.QMessageBox.critical(self, 
                            "Ouverture de la base de données",
                            "Erreur d'ouverture: %s" % self.cnx.lastError().text())
                self.cnx = None
                self.close() # fermeture de vuetable
     
            # créer et configurer le modèle
            self.model = MonModel(self, self.cnx) # voir classe "MonModel" + haut
            self.model.setTable(self.table)
            self.model.setEditStrategy(QtSql.QSqlRelationalTableModel.\
                                                                   OnManualSubmit)
            self.model.select() # méthode surchargée de la classe "MonModel"
     
            # créer le QTableView d'affichage
            self.vue = QtGui.QTableView(self)
     
            # créer le lien entre la base sql et le QTableView grâce au modèle 
            self.vue.setModel(self.model)
            self.vue.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vue))
     
            # tri ascendant du tableau affiché selon la 1ère colonne
            self.vue.setSortingEnabled(True)
            self.vue.sortByColumn(0, QtCore.Qt.AscendingOrder)
     
            # régler la largeur des colonnes en fonction de leur contenu
            self.vue.resizeColumnsToContents()
     
            # faire que le QTableView prenne toute la fenêtre et suive la redim.
            posit = QtGui.QGridLayout()
            posit.addWidget(self.vue, 0, 0)
            self.setLayout(posit)
    #############################################################################
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        basesql = "mabase.db3"
        creabasesql(basesql)
        fen = Vuetable(basesql, "matable")
        fen.show()
        sys.exit(app.exec_())
    Os Windows-XP, windows-7
    Python 3.2
    PyQt 4.9.6
    Et merci pour toute réponse.

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Je ne l'ai jamais fait. Cependant, il existe des extensions officielles, dont une qui devrait te permettre de faire ce que tu souhaites je pense:

    http://www.sqlite.org/support.html#prosupport

    Edit: si tu arrive à faire ce que tu désires, merci d'indiquer dans ce post la procedure
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai déjà cherché, mais il me semble que toutes les solutions permettant de lire/écrire une base cryptée sont payantes.

    Dans le cas où on cherche surtout que, en dehors de l'exécution du programme, le fichier de la base sqlite3 ne puisse pas faire apparaitre trop facilement son contenu, on peut au moins faire la chose suivante:

    - le fichier de la base de données est crypté lorsque le programme n'est pas en exécution (on va voir comment par la suite)

    - au lancement du programme, un mot de passe est demandé. Il est hashé (exemple: avec sha256 de hashlib) et comparé avec le vrai mot de passe hashé lui aussi (et contenu dans le source du programme)
    - si le mot de passe est ok (=> les 2 versions hashées sont identiques): le fichier de la base de données est décrypté avec le mot de passe non hashé (xor)
    - le programme en exécution gère la base de données avec le fichier décrypté
    - à la sortie du programme, le fichier de la base de données est de nouveau crypté avec le mot de passe (xor)
    - le fichier de la base de données non cryptée est effacé correctement (on réécrit dessus avant de le supprimer pour éviter les "undelete")

    Ce n'est peut-être pas de niveau "RSA", mais avec un mot de passe assez long et assez complexe (résistant à une attaque par dictionnaire), ça devrait déjà refroidir pas mal de curieux...

    Si cette solution t'intéresse mais que tu es coincé quelque part dans son développement, je peux essayer de créer un code de test.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 45
    Points
    45
    Par défaut
    Bonjour à tous et merci.

    J’ai pensé de faire un cryptage/décryptage au lancement du programme et a la fermeture. et honnêtement je ne connais rien dans ce domaine. J’aimerais bien savoir comment générer un cryptage.
    Petit soucis qui me passe a l’esprit .si jamais le programme ne se ferme pas proprement que se passe-t-il (la base ne se crypte pas, et du coup au prochain lancement du programme ?!!).
    Et hashlib je ne connais même pas.
    Pour toute proposition, je suis preneur.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Vous avez un exemple pondu par Hellman qui vous montre comment chiffrer les données de certaines colonnes.

    J’ai pensé de faire un cryptage/décryptage au lancement du programme et a la fermeture. et honnêtement je ne connais rien dans ce domaine. J’aimerais bien savoir comment générer un cryptage.
    Petit soucis qui me passe a l’esprit .si jamais le programme ne se ferme pas proprement que se passe-t-il (la base ne se crypte pas, et du coup au prochain lancement du programme ?!!).
    Si le fichier est petit, la base pourrait être chargée en mémoire.
    Lorsque le programme plante, les mises à jour seront perdue - ou vous avez défini un exit handler qui sauve l'état de la base avant de sortir.

    Si le fichier est "gros": il faudra créer un fichier disque qui pourra être lu pendant que programme tourne.
    Autrement dit, chiffrer le fichier ne protégera pas grand chose.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 45
    Points
    45
    Par défaut
    Bonjour à tous.
    j'ai essayé d’exécuter les exemples et j'avoue que je comprends mal l'anglais . j'aimerais bien bien que vous m’écrivez un code simple à exécuter qui peut répondre à mes besoins .
    merci encore pour toute aide

Discussions similaires

  1. Créer une base de Données en Arabe
    Par elmessoussi dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/07/2006, 13h52
  2. créer une base de donnéé
    Par sdow dans le forum Installation
    Réponses: 1
    Dernier message: 20/01/2006, 05h52
  3. Réponses: 5
    Dernier message: 07/11/2005, 11h11
  4. Comment créer une base de donnée Access ?
    Par Soulama dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2005, 14h56
  5. créer une base de donnée à partir d'un script
    Par illegalsene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2005, 14h08

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