Newer
Older
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# cryptologie
# <i class="fa fa-user-secret" aria-hidden="true"></i>
## Pourquoi chiffre-t-on ?
1. Confidentialité
2. Authentification
3. Intégrité
4. Non répudiation
## opérations cryptographiques
* agit sur une donnée en claire
* une chaîne caractère
* un fichier texte
* un fichier multimédia
* une archive
* appelé aussi le **clair**
* le but de la protéger
## Hacher (to hash)
* hash / Empreinte / Condensat
* taille fixe (quelques octets)
* chaque **clair** a un hash unique
* collision = cassé
* pas d’opération inverse
* on parle de hashage
## Hacher (to hash)
<pre><code class="hljs bash"" style="font-size: 16px"">sha256("password") = 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8</code></pre>
* [MD5]([SHA-1](https://fr.wikipedia.org/wiki/MD5) <i class="fa fa-thumbs-down"></i>
* [SHA-1](https://fr.wikipedia.org/wiki/SHA-1) <i class="fa fa-thumbs-down"></i>
* [SHA-2](https://fr.wikipedia.org/wiki/SHA-2) <i class="fa fa-thumbs-up"></i>
* [SHA-256](https://fr.wikipedia.org/wiki/SHA-2#SHA-256)
* [SHA-512](https://fr.wikipedia.org/wiki/SHA-2#SHA-512)
* [SHA-384](https://fr.wikipedia.org/wiki/SHA-2#SHA-384)
* [Hash: online hash value calculator](https://www.fileformat.info/tool/hash.htm)
## Hash / attaques
* [force brute](https://fr.wikipedia.org/wiki/Attaque_par_force_brute)
* testé toutes les possibilités (online / offline)
* [par dictionnaire](https://fr.wikipedia.org/wiki/Attaque_par_dictionnaire)
* testé des combinaisons de possibilités probables (online / offline)
<!-- * [https://github.com/danielmiessler/SecLists/tree/master/Passwords](https://github.com/danielmiessler/SecLists/tree/master/Passwords) -->
* [Tables arc-en-ciel](https://fr.wikipedia.org/wiki/Rainbow_table)
* hashés précalculés de possibilités (offline)
* [https://crackstation.net/](https://crackstation.net/)
* [http://project-rainbowcrack.com/table.htm](http://project-rainbowcrack.com/table.htm)
<!--* [What are the differences between dictionary attack and brute force attack?](https://security.stackexchange.com/questions/67712/what-are-the-differences-between-dictionary-attack-and-brute-force-attack#67768) -->
## Saler (to salt)
* hasher en concaténant la donnée en claire avec une chaîne de caractères pseudo-aléatoires
* stocker le sel au niveau de l'enregistrement de l'utilisateur
* évite les attaques par tables arc-en-ciel
* n'évite pas la force brute / ni les attaques par dictionnaire
* on parle de salaison
## Saler (to salt)
<pre><code class="hljs bash" style="font-size: 14px">sha256("hello"."bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab</code></pre>
* utilisé notamment pour le stockage des mots de passe en base de données
* [Salted Password Hashing - Doing it Right](https://crackstation.net/hashing-security.htm)
## Coder (to encode)
* changer la manière de stocker la donnée en clair
* n'est pas réellement une opération cryptographique
* pas de secret
* la donnée n'est pas protégée
* on parle de codage
<pre><code class="hljs bash" style="font-size: 25px">base64_encode("all in clear") = YWxsIGluIGNsZWFy</code></pre>
* opération inverse décoder (to decode)
<pre><code class="hljs bash" style="font-size: 25px">base64_decode("YWxsIGluIGNsZWFy") = all in clear</code></pre>
## Chiffrer (to encrypt)
* rendre la compréhension de la donnée en claire impossible à quiconque ne possède pas le secret (la **clé** pour la lire)
* on parle de chiffrement
<pre><code class="hljs bash" style="font-size: 16px">openssl_encrypt("all in clear","aes128","secret") = d2xhqzZbLFzoCP6vNfdVOg==</code></pre>
* opération inverse déchiffrer (to decrypt)
<pre><code class="hljs bash" style="font-size: 16px">openssl_decrypt("d2xhqzZbLFzoCP6vNfdVOg==","aes128","secret") = all in clear</code></pre>
* Deux options : symétrique ou asymétrique
## Le reste ...
* **Décrypter**
* chercher à deviner la donnée en claire sans disposer du secret
* **Chiffrage**
* pour les devis (en homme / jour)
* **[Crypter, cryptage, encrypter n'existent pas](http://www.bortzmeyer.org/cryptage-n-existe-pas.html)**
* reviendrait à tenter de chiffrer sans connaîre le secret
* non sens
## en termes scientifiques ...
* **Cryptologie**
* science du secret
* **Cryptographie**
* comment protéger les messages
* **Cryptogranalyse**
* comment décrypter les messages
## Chiffrement symétrique
* Dit **à clé secrète**, **à clé privée**, ou encore **à secret partagé**
* le secret permet de chiffrer **et** de déchiffrer
* plus le secret est **long** plus il est difficile de le deviner
* <i class="fa fa-thumbs-o-up"></i> peu gourmand en calcul
* <i class="fa fa-thumbs-o-down"></i> la clé doit être partagée par l'émetteur et le(s) récepteur(s)
## Chiffrements symétriques connus
* <i class="fa fa-thumbs-down"></i> faibles
* Scytale spartiate, ROT13, Chiffre de Jules César
* <i class="fa fa-thumbs-up"></i> robustes
* Blowfish, AES, Twofish
* pour n destiantaires
* n * (n-1) / 2 clés
* démultiplication des clés
* avoir la garantie que les chiffrés sont uniques
* se stocke en clair
* n'est utilisable qu'avec le secret
* deux messages identiques chiffrés avec de **vi** différents auront des chiffrés différents
```
$crypt = openssl_encrypt("all in clear", "aes128", "secret");
```
<pre><code class="hljs bash"" style="font-size: 16px">PHP Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /data/htdocs/blog.limos.fr/tmp.php on line 4
Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /data/htdocs/blog.limos.fr/tmp.php on line 4</code></pre>
<pre><code class="hljs bash"" style="font-size: 18px">$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes128"));
$crypt = openssl_encrypt("all in clear", "aes128", "secret", true, $iv);
$clear = openssl_decrypt($crypt, "aes128", "secret", true , $iv);
</code></pre>
note:
- https://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt
* un message chiffré avec une clé publique sera déchiffrable avec la clé privée associée
* un message chiffré avec une clé privé sera déchiffrable avec la clé publique associée
## Chiffrement asymétrique
* la clé publique doit être connue de l'expéditeur
* plus complexe d'un simple secret à transmettre
* demande plus de ressources
* <i class="fa fa-thumbs-o-down"></i> gourmand en calcul
* <i class="fa fa-thumbs-up"></i> le plus connu
* [RSA](https://fr.wikipedia.org/wiki/Chiffrement_RSA) since 1977
* Algo à courbes elliptiques
## distribution des clés?
* sur une page web
* via une carte de visite (QrCode)
* via une pièce jointe
* via un chat
* quiconque la possède peut se l'utiliser en se faisant passer pour vous
* Alice et Bob se ont chacun généré un couple **clé publique** / **clé privée**
* ils se sont **échangés** leur **clé publique** respective
* sa **clé publique**, sa **clé privée** et la **clé publique** de Bob
* sa **clé publique**, sa **clé privée** et la **clé publique** d'Alice
## Signature
* Alice chiffre un message avec sa clé privée et l'envoi à Bob
* Bob peut déchiffrer le message avec la clé publique d'Alice
* Bob est alors sûr que le message a été émis avec la clé privée d'Alice
* **Autentification de l'origine**
* Alice envoie
* le message chiffré
* un hashé chiffré du message
* Bob peut vérifier en
* déchiffrant le message avec la clé publique d'Alice
* calculant le hashé du message en clair
* déchiffrant le hashé chiffré envoyé par Alice
* comparant le hashé calculé et le hashé déchiffré
* Bob a pu vérifier
* la clé à l'origine du message **autentification de l'origine**
* l'**intégrité** du message
**autentification de l'origine** + **intégrité**
=
**non répudiation**
#### Les clés de Bob n'ont jamais été utilisées
## Chiffrement
* Bob veut maintenant écrire à Alice
* qu'il sait être la vraie Alice
* en tout cas celle qui possède la clé privée associée à la clé publique qu'Alice lui a donné
* Bob chiffre le message avec la clé publique d'Alice
* Bob envoie le texte chiffré
* Alice déchiffre le message grâce à sa clé privée.
* garanti la **confidentialité**
* Eve a récupéré la **clé privée** de Bob (mal protégée)
* elle peut envoyer des messages chiffrés à Alice, et à toutte sa toile de confiance
* en se faisant passer pour Bob
* elle peut lire tous les messages chiffrés avec la **clé publique** de Bob
## Bonne pratique
* toujours signer et chiffrer ses messages
* toujours être certain de l'identité du possesseur de la clé
* échange de clé IRL
* bien protéger sa clé privée
* stockée en sécurité
* protégée par un mot de passe fort
* attributs
* nom
* mail
* date d'expiration
* algorithmes
* ...
* au moins une signature
## Trousseau
* ensemble de clés
* couples clé publique / clé privée
* fonctions
* signature
* chiffrement
* création de certificat
* authentification
* clés publiques
* importés (contacts)