Exercice 3 Polynésie – Bac NSI 2025 – Jour 1
mots clés: SQL, systèmes d'exploitation, sécurisation des communications
🔎 Voir les exercices similaires ↓
Polynésie – Bac NSI 2025 – Jour 1 Énoncé de l'exercice 3
Cet exercice porte sur la programmation en Python, les bases de données relationnelles, le langage SQL, les systèmes d’exploitation et la sécurisation des communications.
Pour simplifier la gestion de ses mots de passe, Alice décide de créer un gestionnaire de mots de passe regroupant les informations de connexion de chaque site qu’elle utilise.
Partie A
Dans cette partie, on s’intéresse à la création des mots de passe d’Alice. On s’aidera de la table ASCII de la Figure 1 donnant le code ASCII en décimal et en hexadécimal des différents caractères utilisés dans ce sujet (lettres minuscules, lettres majuscules et les caractères spéciaux encadrés).

Source : d’après https://fr.m.wikipedia.org/wiki/Fichier : ASCII-Table.svg
Alice souhaite créer une fonction Python gen_mdp lui permettant de créer aléatoirement un mot de passe. Cette fonction :
prend en paramètres :
longueur (de type int) : le nombre de caractères du mot de passe ;
cont_min (de type bool) : un booléen indiquant si le mot de passe peut contenir des minuscules (True) ou non (False) ;
cont_maj (de type bool) : un booléen indiquant si le mot de passe peut contenir des majuscules (True) ou non (False) ;
cont_spe (de type bool) : un booléen indiquant si le mot de passe peut contenir des caractères spéciaux (True) ou non (False) ;
et renvoie un mot de passe (de type str) respectant les conditions définies par les paramètres.
On donne ci-dessous le code de la fonction gen_mdp qui sera à compléter au fur et à mesure des questions.
from random import randint
def gen_mdp(longueur, cont_min, cont_maj, cont_spe):
# Pour qu'un mot de passe soit non vide, il doit
# pouvoir contenir des minuscules ou des majuscules
# ou des caractères spéciaux.
assert (cont_min or cont_maj or cont_spe)
minuscules = [chr(i) for i in ...]
majuscules = [...]
caracteres_speciaux = ... + ...
jeu_caracteres = []
if cont_min:
...
...
...
...
...
mot_de_passe = ''
n = len(jeu_caracteres)
for i in range(longueur):
mot_de_passe = ...
return mot_de_passe
On rappelle que l’opérateur + permet en Python d’additionner deux éléments de type int, mais aussi de concaténer deux éléments de type list, ou encore deux éléments de type str.
On rappelle également que chr(i) renvoie la chaîne représentant un caractère dont le code ASCII est le nombre entier i.
Par exemple, chr(97) renvoie la chaîne de caractères 'a', tandis que chr(33) renvoie la chaîne de caractères '!'.
Alice s’inscrit sur un nouveau site lui demandant de créer un mot de passe de 8 caractères minimum, composé uniquement de majuscules et de minuscules. Écrire un appel à la fonction gen_mdp qui permette de répondre aux exigences de ce site.
On admet que les caractères spéciaux sont uniquement ceux encadrés à la Figure 1.
Recopier et compléter les lignes 8 à 10 du code de la fonction gen_mdp permettant d’initialiser les trois variables minuscules, majuscules et caracteres_speciaux. On utilisera obligatoirement la syntaxe de tableaux donnés en compréhension pour cette initialisation. Après cette initialisation, on doit avoir :
minuscules = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
majuscules = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
caracteres_speciaux = ['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+',
',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@']
La variable jeu_caracteres de la fonction gen_mdp est une liste contenant tous les caractères autorisés pour fabriquer un nouveau mot de passe. Recopier et compléter la ligne 13 du code de la fonction gen_mdp, puis écrire les autres lignes de code afin de créer la variable jeu_caracteres. Le nombre de lignes de code à insérer est laissé à l’appréciation du candidat.
La documentation de la fonction randint indique que randint(a, b) renvoie un entier aléatoire compris entre les entiers a et b incluant les deux extrémités a et b. Recopier et compléter la ligne 21 du code de la fonction gen_mdp.
Un site demande de créer un mot de passe possédant obligatoirement les caractéristiques suivantes :
le mot de passe doit contenir au moins 12 caractères ;
le mot de passe doit contenir au moins un caractère spécial et au moins une lettre minuscule.
Expliquer en quoi le code de la fonction gen_mdp peut renvoyer un mot de passe qui ne répond pas aux exigences du site.
Partie B
Dans cette partie, on pourra utiliser les clauses du langage SQL pour :
construire des requêtes d’interrogation à l’aide de SELECT, FROM, WHERE (avec les opérateurs logiques AND, OR), JOIN ... ON ;
construire des requêtes d’insertion et de mise à jour à l’aide de UPDATE, INSERT, DELETE ;
affiner les recherches à l’aide de DISTINCT, ORDER BY.
Alice souhaite mettre en œuvre une base de données composée des deux tables compte et site dont des extraits sont donnés dans les tableaux suivants.
| compte | |||
|---|---|---|---|
| mot_de_passe | utilisateur | renouvellement | id_site |
| Asrtg!Myfj | aliceB24 | 2022-06-30 | 1 |
| @rDfohpj!& | aliceB24 | 2021-03-12 | 2 |
| GxRGDxc(u-PM | alice_B@votremailp.me | 2018-10-14 | 4 |
| Ghcj=+f*AZs | alice1276 | 2022-06-30 | 3 |
| cYFgt!:Ehr; | alice_B2@votremailp.me | 2022-06-30 | 4 |
| site | ||
|---|---|---|
| id | nom_site | url |
| 1 | Vosnotes | https://logi-educ.net/vosnotes/eleve.html |
| 2 | Banque Perso | https://www.banqueperso.fr/connexion.html |
| 3 | Elec verte | https://espace-client.ev.fr/login |
| 4 | Votremailp | https://account.votremailp.me/login |
L’attribut mot_de_passe est une clé primaire de la table compte.
L’attribut id est une clé primaire de la table site.
L’attribut renouvellement, correspondant au dernier renouvellement du mot de passe, est une chaîne de caractères de format AAAA-MM-JJ. Ainsi un mot de passe renouvelé le 21 février 2025 correspond à un attribut renouvellement de '2025-02-21'.
Dans la table compte, l’attribut id_site est une clé étrangère référençant l’attribut id de la table site.
Expliquer en quoi il n’est pas possible, pour Alice, d’avoir le même mot de passe pour deux sites différents.
Écrire la requête SQL permettant d’afficher toutes les URL enregistrées dans la base de données.
La Banque Perso a demandé à Alice de renouveler son mot de passe. Elle remplace le mot de passe '@rDfohpj!&' par 'yhTS?d@UTJe'. Écrire la requête SQL permettant de faire la modification dans la base de données. Dans cette question, on ignorera l’attribut renouvellement et on ne cherchera pas à le mettre à jour.
On rappelle que le langage SQL utilise l’ordre lexicographique (ordre du dictionnaire) pour comparer deux éléments de type texte. Selon cet ordre, on a par exemple '3' supérieur à '1' et 'python' est inférieur à 'sql'.
À la date du 20 mars 2025, Alice a décidé de lister tous les mots de passe qui n’ont pas été renouvelés depuis plus d’un an. Écrire la requête SQL permettant de donner la liste des id_site concernés.
Donner une raison pour laquelle Alice a préféré choisir le format AAAA-MM-JJ pour l’attribut renouvellement plutôt que le format JJ-MM-AAAA.
Écrire une requête SQL permettant d’afficher tous les utilisateurs et les mots de passe du ou des sites de nom 'Votremailp' dont l’identifiant est supposé non connu. Le résultat devra être affiché par ordre chronologique de date de renouvellement de mot de passe.
Pour réaliser le projet, il aurait été possible de regrouper toutes les informations dans une seule table mais Alice a choisi d’utiliser deux tables : les tables site et compte. Donner un avantage impliqué par le choix d’Alice.
Partie C
Dans cette partie, on s’intéresse à la sécurité du gestionnaire de mots de passe d’Alice. Alice utilise un système d’exploitation multi-utilisateurs basé sur Linux et elle a les droits de lecture, d’écriture et d’exécution dans son répertoire personnel /home.
La base de données est stockée dans un fichier gestionnaire.db.
Alice décide de chiffrer ce fichier. Elle crée un fichier chiffrement.py dans lequel elle écrit le code d’une fonction Python chiffrement dont la documentation est donnée ci-après.
def chiffrement(f_source, f_dest, f_cle):
'''Crée un fichier f_dest contenant les données
du fichier f_source chiffrées selon la clé
contenue dans le fichier f_cle.
f_source (str) : chemin vers le fichier à chiffrer
f_dest (str) : chemin vers le fichier chiffré
f_cle (str) : chemin vers le fichier contenant la clé
'''
On donne l’arborescence de fichiers utilisée par Alice sur la Figure 2.

Alice ouvre un interpréteur Python dans le répertoire Documents, qui est ainsi le répertoire courant (ou répertoire de travail) et exécute le contenu du fichier chiffrement.py.
Écrire l’appel à la fonction chiffrement permettant, à l’aide de la clé contenue dans le fichier cle, de chiffrer le fichier gestionnaire.db en créant le fichier chiffré secret.db dans le répertoire Perso.
L’algorithme de chiffrement consiste à appliquer l’opération OU-exclusif bit à bit entre le fichier source et le fichier contenant la clé de chiffrement.
Le premier bit du fichier chiffré est le résultat du OU-exclusif entre le premier bit du fichier source et le premier bit du fichier clé. De même, le deuxième bit est obtenu par le OU-exclusif entre les deuxièmes bits de ces deux fichiers et ainsi de suite.
On suppose, pour simplifier, que le fichier contenant la clé est de la même taille que le fichier source, qui est donc aussi la taille du fichier chiffré.
On rappelle ci-après la table de vérité du OU-exclusif, noté XOR.
| Table de vérité du XOR | ||
|---|---|---|
| a | b | a XOR b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
On rappelle que l’hexadécimal correspond à l’écriture des entiers dans la base 16. Les chiffres de cette base sont notés 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
Donner le résultat, en écriture hexadécimale, de l’opération OU-exclusif bit à bit entre deux octets dont les écritures hexadécimales sont respectivement A3 et 59.
Montrer que, pour tous bits a et b, on a la propriété suivante : (a XOR b) XOR b = a.
Indiquer, en justifiant, si le chiffrement utilisé par Alice est symétrique ou asymétrique.
Alice exécute la commande ls -l secret.db et obtient la réponse donnée ci-dessous :
-rw-r--r-- 1 alice eleves 42480 mars 25 11:57 secret.db
Justifier le fait qu’un attaquant a le champ libre pour tenter un déchiffrement du fichier secret.db et expliquer ce que devrait faire Alice pour corriger ce problème.
Partie D
On donne ci-dessous quatre bonnes pratiques proposées par le gouvernement en matière de gestion des mots de passe.
P1 : Utilisez un mot de passe différent pour chaque accès (messagerie, banque en ligne, comptes de réseaux sociaux, etc.) : en cas de compromission de l’un de vos comptes, cela évitera l’effet boule de neige.
P2 : Créez un mot de passe suffisamment long, complexe et inattendu, de 8 caractères minimum, contenant des minuscules, des majuscules, des chiffres et des caractères spéciaux.
P3 : Ne communiquez jamais votre mot de passe à un tiers : aucune organisation ou personne de confiance ne vous demandera de lui communiquer votre mot de passe.
P4 : Utilisez un gestionnaire de mots de passe : pas simple de retenir tous ses codes de connexion ! Heureusement des outils de type « coffres forts de mots de passe » existent. Ces derniers mémorisent tous vos mots de passe et vous permettent d’en générer de manière aléatoire.
Source : d’après https://cyber.gouv.fr/bonnes-pratiques-protegez-vous
En justifiant votre réponse, préciser en quoi les choix d’Alice dans la conception de son gestionnaire de mots de passe respectent ou non chacune des quatre bonnes pratiques mentionnées.
Polynésie – Bac NSI 2025 – Jour 1 Correction de l'exercice 3
Partie A – Génération de mots de passe
1. Appel de gen_mdp
gen_mdp(8, True, True, False)
2. Lignes 8 à 10
minuscules = [chr(i) for i in range(97, 123)]
majuscules = [chr(i) for i in range(65, 91)]
caracteres_speciaux = [chr(i) for i in range(33, 48)] + \
[chr(i) for i in range(58, 65)]
3. Création de jeu_caracteres (ligne 13 et suivantes)
jeu_caracteres = []
if cont_min:
jeu_caracteres = jeu_caracteres + minuscules # ligne 13
if cont_maj: # ligne 14
jeu_caracteres = jeu_caracteres + majuscules # ligne 15
if cont_spe: # ligne 16
jeu_caracteres = jeu_caracteres + caracteres_speciaux # ligne 17
4. Ligne 21
for i in range(longueur):
mot_de_passe = mot_de_passe + jeu_caracteres[randint(0, n - 1)]
5. Mot de passe non conforme
Avec gen_mdp(12, True, False, True), chaque caractère est tiré au hasard parmi les minuscules et les caractères spéciaux, mais rien n’oblige le mot de passe à contenir au moins un caractère de chaque type : il peut, par exemple, n’être composé que de minuscules.
Partie B – Base de données
6. Un même mot de passe pour deux sites ?
mot_de_passe est la clé primaire de la table compte : deux enregistrements ne peuvent pas avoir la même valeur. Alice ne peut donc pas enregistrer le même mot de passe pour deux comptes.
7. Toutes les URL
SELECT url
FROM site;
8. Nouveau mot de passe de la Banque Perso
UPDATE compte
SET mot_de_passe = 'yhTS?d@UTJe'
WHERE mot_de_passe = '@rDfohpj!&';
9. Mots de passe non renouvelés depuis plus d’un an
SELECT DISTINCT id_site
FROM compte
WHERE renouvellement < '2024-03-20';
10. Pourquoi le format AAAA-MM-JJ ?
Avec AAAA-MM-JJ, l’ordre lexicographique coïncide avec l’ordre chronologique : on compare d’abord l’année, puis le mois, puis le jour. On peut donc comparer et trier les dates avec <, > et ORDER BY.
11. Comptes du site Votremailp
SELECT utilisateur, mot_de_passe
FROM compte
JOIN site ON compte.id_site = site.id
WHERE site.nom_site = 'Votremailp'
ORDER BY renouvellement;
12. Avantage de deux tables
On évite la redondance : le nom et l’URL d’un site ne sont enregistrés qu’une fois, même si Alice y a plusieurs comptes (comme Votremailp). Une modification d’URL ne se fait qu’à un seul endroit, sans risque d’incohérence.
Partie C – Sécurité
13. Appel de chiffrement
Le répertoire courant est Documents, qui contient gestionnaire.db. Le dossier Perso est au même niveau que Documents, dans home :
chiffrement('gestionnaire.db', '../Perso/secret.db', '../Perso/cle')
14. A3 XOR 59
| binaire | hexadécimal | |
|---|---|---|
| A3 | 1010 0011 | A3 |
| 59 | 0101 1001 | 59 |
| A3 XOR 59 | 1111 1010 | FA |
Le résultat est FA.
15. (a XOR b) XOR b = a
| a | b | a XOR b | (a XOR b) XOR b |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
Dans les quatre cas, la dernière colonne est égale à la colonne a : (a XOR b) XOR b = a.
16. Chiffrement symétrique ou asymétrique ?
Le chiffrement est symétrique : d’après la question 15, en appliquant de nouveau XOR avec la même clé, on retrouve le fichier d’origine. La même clé sert à chiffrer et à déchiffrer.
17. Droits du fichier secret.db
-rw-r--r-- : le propriétaire (alice) peut lire et écrire, mais les membres du groupe eleves et tous les autres utilisateurs peuvent lire le fichier. N’importe qui peut donc le copier et tenter de le déchiffrer.
Alice doit retirer les droits de lecture au groupe et aux autres : chmod 600 secret.db (ou chmod go-r secret.db).
Partie D – Bonnes pratiques
18. Les choix d’Alice et les quatre bonnes pratiques
P1 (un mot de passe par accès) : respectée. mot_de_passe étant la clé primaire, la base interdit d’utiliser deux fois le même mot de passe (question 6) ; de plus, gen_mdp génère des mots de passe aléatoires.
P2 (mot de passe long et complexe) : en partie seulement. La longueur est réglable et les caractères sont aléatoires, mais gen_mdp n’utilise jamais de chiffres et ne garantit pas la présence de chaque type de caractère (question 5).
P3 (ne pas communiquer son mot de passe) : menacée. Alice ne transmet rien volontairement, mais secret.db est lisible par tous (question 17) et gestionnaire.db reste en clair : ses mots de passe sont à la portée des autres utilisateurs.
P4 (utiliser un gestionnaire) : respectée. C’est précisément ce qu’Alice a construit, avec un générateur de mots de passe aléatoires.
Une erreur, un oubli ? Écrivez-moi : frederic.peuriere@lfcl.pt
🔎 Exercices sur des thèmes similaires
-
Sujet Zéro 2023 – jour 2 – exercice 1
commande Linux, traitement des données en tables, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Sujet Zéro 2023 – jour 1 – exercice 1
BDD, SQL, types construits — Difficulté : 🔥🔥🔥🔥🔥 -
Nouvelle Caldédonie 2023 – jour 2 – exercice 1
BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Nouvelle Caldédonie 2023 – jour 1 – exercice 1
BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2025 – jour 1 – exercice 3
dictionnaires, sécurisation des communications, programmation. — Difficulté : 🔥🔥🔥🔥🔥 -
Centres étrangers 2026 – jour 2 – exercice 2
BDD, SQL, réseaux, protocoles de routage — Difficulté : 🔥🔥🔥🔥🔥