Mécanismes cryptographiques
Vous trouverez ici une brève définition des mécanismes cryptographiques utilisés par Seald.
Leur implémentation utilisée dans Seald est SSCrypto.
Génération d'aléa
Selon l'environnement cible, différents générateurs d'aléa sont utilisés :
- Node.js : la fonction
crypto.randomBytesfournie par le modulecrypto; - Navigateur : si SubtleCrypto est disponible
window.crypto.getRandomValuesest utilisé. Pour les navigateurs très anciens (Chrome <37, Edge<12, IE<11, Firefox<34, Opera<24, Safari<7) une implémentation en pur JavaScript est fournie par node-forge, il s'agit d'une version modifiée de Fortuna dont le seed est dérivé de la date et de paramètres d'utilisation du navigateur (mouvements de souris, etc.). - React-native : le module
react-native-get-random-valuesfournit un seed sécurisé pour le PRNG basé sur Fortuna de node-forge.
Générateur de paires de clés asymétriques
Les clés utilisées sont de type RSA (voir RFC 8017).
Selon l'environnement cible, différents générateurs de paires de clés asymétriques sont utilisés&bsp;:
- Node.js : la fonction
crypto.generateKeyPairfournie par le modulecrypto; - Navigateur : si SubtleCrypto est disponible
window.crypto.subtle.generateKeyest utilisé. Pour les navigateurs très anciens (Chrome <37, Edge<79, IE, Firefox<34, Opera<24, Safari<7) une implémentation en pur JavaScript est fournie par node-forge, il s'agit d'une version dePRIMEINC; - React-native : le module
react-native-rsa-nativequi utilise le générateur de SpongyCastle en version 1.56 sur Android et celui de la bibliothèque standard sur iOS.
Chiffrement symétrique
Pour chiffrer symétriquement, deux algorithmes sont utilisés pour assurer à la fois la confidentialité et l'intégrité : un algorithme de chiffrement symétrique ne garantissant que la confidentialité, et un MAC pour assurer l'intégrité.
Dimensionnement
Deux clés symétriques sont utilisées :
- une clé de chiffrement de 256 bits notée
encryptionKey; - une clé pour le MAC de 256 bits notée
authenticationKey.
Leur concaténation dans cet ordre est notée messageKey.
Durée de vie
Les clés sont utilisées pour une durée indéterminée pour les données qu'elles protègent.
Chiffrement
Le chiffrement symétrique de clearText avec une messageKey (concaténation de encryptionKey et de authenticationKey) pour obtenir cipheredMessage se fait comme suit :
- génération d'un vecteur d'initialisation aléatoire noté
ivde 128 bits ; - chiffrement :
- algorithme :
AES-256-CBC(voir FIPS 197 et NIST Special Publication 800-38A §6.2)) ; - vecteur d'initialisation :
iv; - clé :
encryptionKey; - argument :
clearText; - résultat :
cipherText;
- algorithme :
- MAC :
- algorithme :
HMAC-SHA-256(voir RFC 6234 §8.3) ; - argument (
message_arraydans la RFC 6234) : la concaténation deivet decipherText; - clé (
keydans la RFC 6234) :authenticationKey; - résultat :
hmac;
- algorithme :
- retourner :
cipheredMessagequi est la concaténation deiv,cipherText, ethmac.
Déchiffrement
Le déchiffrement symétrique de cipheredMessage (concaténation de iv, cipherText, et hmac) avec une messageKey (concaténation de encryptionKey et de authenticationKey) pour obtenir clearText se fait comme suit :
- MAC :
- algorithme :
HMAC-SHA-256(voir RFC 6234 §8.3) ; - argument (
message_arraydans la RFC 6234) : la concaténation deivet decipherText; - clé (
keydans la RFC 6234) :authenticationKey; - résultat :
hmac;
- algorithme :
- comparaison de
hmacavechmac2, si égal poursuivre ; - déchiffrement :
- algorithme :
AES-256-CBC(voir FIPS 197 et NIST Special Publication 800-38A §6.2)) ; - vecteur d'initialisation :
iv; - argument :
cipherText; - clé :
encryptionKey; - résultat :
clearText;
- algorithme :
- retourner
clearText.
Enveloppe
Lors de l'utilisation du SDK, cipheredMessage est mis dans un format d'enveloppe :
- soit de fichier ;
- soit de message.
Implémentation
L'implémentation utilisée dépend de l'environnement cible ;
- Node.js : la fonction
crypto.createCipherivpour l'AES etcrypto.createHmacpour le HMAC fournies par le modulecrypto; - Navigateur : si SubtleCrypto est disponible,
window.crypto.subtle.encryptest utilisé pour l'AES etwindow.crypto.subtle.signest utilisé pour le HMAC. Pour les navigateurs très anciens (Chrome <37, Edge<79, IE, Firefox<34, Opera<24, Safari<7) une implémentation en pur JavaScript est fournie par node-forge. - React-native : une implémentation en pur JavaScript est fournie par node-forge.
Cryptographie asymétrique
Les clés utilisées sont de type RSA (voir RFC 8017).
Une paire de clés est réservée aux opérations de chiffrement, une autre aux opérations de signature.
Dimensionnement
Les clés sont générées avec un module n de 4096 bits et un exposant public e de 65537.
Durée de vie
Ces clés sont générées pour une durée ne pouvant excéder 157680000 secondes (5 ans), avec une durée de vie par défaut à 94608000 secondes (3 ans).
Chiffrement asymétrique
Le chiffrement asymétrique d'un clearText avec une clé publique notée (n,e) donnée pour obtenir cipheredMessage est effectué comme suit :
- calculer une somme de contrôle de type
CRC32(voir POSIX.1-2017 §chksum) surclearTextpour donnercrc32de longueur 32 bits ; - chiffrement :
- algorithme :
RSAES-OAEP(voir RFC 8017 §7.1.1) avec les paramètres suivants :SHA1comme fonction de hachageMGF1-SHA1(voir RFC 8017 §B.2.1) comme fonction de génération de masque- le label
Llaissé vide
- argument (noté
Mdans RFC 8017 §7.1.1) : concaténation decrc32et decleartext - clé utilisée (notée
(n,e)dans RFC 8017 §7.1.1) : clé publique du destinataire - résultat
cipheredMessage
- algorithme :
- retourner :
cipheredMessage
TIP
L'utilisation de SHA-1 comme fonction de hachage dans RSAES-OAEP est robuste et conforme au RGS v2.0 (voir §B1.2.2.2), même en considérant que des collisions sont possibles. Pour plus d'informations, voir What Hashes Make RSA-OAEP Secure?.
Déchiffrement asymétrique
Le déchiffrement asymétrique d'un cipheredMessage avec une clé privée notée K donnée pour obtenir clearText est effectué comme suit :
- déchiffrement :
- algorithme :
RSAES-OAEP(voir RFC 8017 §7.1.2) avec les paramètres suivants :SHA1comme fonction de hachage ;MGF1-SHA1(voir RFC 8017 §B.2.1) comme fonction de génération de masque ;- le label
Llaissé vide ;
- argument (noté
Cdans RFC 8017 §7.1.2) : concaténation decrc32et decleartext; - clé utilisée (notée
Kdans RFC 8017 §7.1.2) : clé privée du destinataire ; - résultat
decipheredMessage;
- algorithme :
- décomposer
decipheredMessageencrc32etclearText; - calculer une somme de contrôle de type
CRC32(voir POSIX.1-2017 §chksum) surclearTextpour donnercrc32-2de longueur 32 bits ; - comparer
crc32etcrc32-2, si égaux poursuivre ; - retourner :
clearText.
Signature
La production d'une signature signature d'un textToSign à l'aide d'une clé privée notée K est effectuée comme suit :
- signature :
- algorithme :
RSASSA-PSS(voir RFC 8017 §8.1.1), utilisant à la première étape l’encodageEMSA-PSS(voir RFC 8017 §9.1.1) avec les paramètres suivants :SHA256comme fonction de hachage ;MGF1(voir RFC 8017 §B.2.1) avecSHA256comme fonction de hachage ;sLen: la longueur maximale valant 478 bytes vu la fonction de hachage choisie et la longueur du module de la clé choisie ;
- argument (noté
Mdans RFC 8017 §8.1.1) :textToSign; - clé utilisée (notée
Kdans RFC 8017 §8.1.1) : Clé privée du signataire ; - résultat :
signature;
- algorithme :
- retourner :
signature.
Vérification de signature
La vérification d'une signature signature d'un textToSign à l'aide d'une clé publique notée (n,e) associée à la clé privée K utilisée pour signer est effectuée comme suit :
- vérification de signature :
- algorithme :
RSASSA-PSS(voir RFC 8017 §8.1.1), utilisant à la première étape l’encodageEMSA-PSS(voir RFC 8017 §9.1.1) avec les paramètres suivants :SHA256comme fonction de hachage ;MGF1(voir RFC 8017 §B.2.1) avecSHA256comme fonction de hachage ;sLen: la longueur maximale valant 478 octets vu la fonction de hachage choisie et la longueur choisie pour le module de la clé ;
- arguments :
- message (noté
Mdans RFC 8017 §8.1.2) :textToSign; - signature (notée
Sdans RFC 8017 §8.1.2) :signature;
- message (noté
- clé utilisée (notée
(n,e)dans RFC 8017 §8.1.2) : Clé publique du signataire ; - résultat : booléen
signatureIsValidindiquant si la signature est valide pour le message ;
- algorithme :
- retourner :
signatureIsValid.
Implémentation
L'implémentation utilisée dépend de l'environnement cible ;
- Node.js : les fonctions
crypto.privateDecrypt,crypto.publicEncrypt,crypto.signetcrypto.verifyfournies par le modulecrypto; - Navigateur : si SubtleCrypto est disponible,
window.crypto.subtle.encrypt,window.crypto.subtle.decrypt,window.crypto.subtle.signetwindow.crypto.subtle.verifysont utilisées. Pour les navigateurs très anciens (Chrome <37, Edge<79, IE, Firefox<34, Opera<24, Safari<7) une implémentation en pur JavaScript est fournie par node-forge. - React-native : une implémentation en pur JavaScript est fournie par node-forge.
Dérivation de clé
La dérivation de clé à partir d'un passphrase et d'un salt pour obtenir key est effectuée comme suit :
- dérivation :
- algorithme :
SCrypt, avec les paramètres suivants :N: 16384 ;r: 8 ;p: 1 ;- taille de sortie : 64 octets ;
- arguments :
passphraseetsaltdonnés ; - résultat :
key;
- algorithme :
- retourner :
key.
Implémentation
L'implémentation utilisée dépend de l'environnement cible ;
- Node.js : la fonction
crypto.scryptfournie par le modulecryptoest utilisée ; - Navigateur : le module
scrypt-jsest utilisé. - React-native : le module
@seald-io/react-native-scryptest utilisé, qui lui-même utilise libscrypt.