Digital signature.
Authentifier l'émetteur d'un message.
En théorie la signature d'un message consiste à envoyer 2 informations :
Ensuite le destinataire :
En pratique, ce principe n'est pas vraiment satisfaisant car :
En pratique donc, l'envoi d'un message signé (mais non crypté) consiste à :
Pour vérifier si le message est bien celui de l'émetteur, le récepteur :
Un algorithme de signature est donc toujours composé d'algorithmes :
Dans le monde Java, le concept de signature peut être appliqué dans divers buts :
keytool
de Java [1.2+] ne permet que de générer des certificats auto-signés. Parce que le rôle d'un
certificat est d'authentifier, la signature d'un certificat requiert la clé privée de l'identité certifiante. Si
vous n'en disposez pas déjà, vous pouvez générer votre paire de clés et un certificat par défaut (auto-signé) à
l'aide de l'outil keytool. Pour générer votre paire de clés, keytool
a
besoin :
Par exemple :
keytool -genkey -alias <b>monNom</b> -keypass
<b>monMotDePasse</b>
(keytool vous demandera le mot de passe d'accès à la base de clés) A la génération de votre paire de clés,
keytool en profite pour vous générer un certificat auto-signé (signé par vous-même).
Pour générer un certificat en général, et ce certificat en particulier, keytool a
besoin de votre DN. Une fois ces informations entrées,
keytool
génère une paire de clés et un certificat auto-signé et l'insère dans la base de clés sous
l'alias spécifié.
java.security.Signature
,
récupérable via un mécanisme de fabrique permettant de spécifier la combinaison d'algorithmes utilisée :
import java.security.*;
Signature maSignature = Signature.getInstance ("SHA1withDSA");
La spécification des algorithmes est obligatoire pour l'objet Signature, contrairement à keytool qui utilise
SHA1withDSA
par défaut. L'objet Signature
ne vous permet que de signer des données
avec une clé privée. La signature identifiant l'émetteur de l'objet, elle nécessite ensuite la clé privée de cet émetteur (de type java.security.PrivateKey
)
:
maSignature.initSign (maClePrivee);
La technique fournissant les données et générant la signature finale est ensuite similaire à celle du condensé de message. On fournit les données via la méthode update() :
byte[] donnees1 = { 1, 21, 3, 4 };<br> byte[] donnees2 = { 5, 2, 3, 7, 8, 12};<br> <br>
maSignature.update
(donnees1);<br> maSignature.update (donnees2);
et la génération de la signature se faisant via la méthode sign().
byte[] donneesSignature = maSignature.sign();
les données retournées constituant le condensé (SHA, MD2d122Remplacé par MD5, MD5) signé (DSA, RSA) du message dépendant des algorithmes spécifiés à la création de l'objet signature ;
java.security.Signature
. La vérification consistant à vérifier
l'identité de l'émetteur de l'objet, elle nécessite ensuite la clé
publique de cet émetteur (de type java.security.PublicKey
) :
telleSignature.initVerify (telleClePublique);
et la vérification de la signature se fait via la méthode verify().
boolean signatureOk = maSignature.verify();
jarsigner
<b>MyApplet.jar monAlias</b>
. Cette opération de signature consiste en l'ajout de deux fichiers dans
le répertoire META-INF/
cette archive :
alias.dsa
ou alias.rsa
contenant une
signature pour le fichier alias.sf ainsi que le certificat (et la clé publique donc) du signataire.Un fichier JAR peut être signé par plusieurs entités (en lançant jarsigner plusieurs fois sur ce fichier), afin de permettre différents profils d'autorisations pour la même applet ;
Cependant, d'une manière générale, Java 2 ne permet que de signer dans un but d'authentification, c'est-à-dire avec une clé privée.
La plate-forme Java [1.2+] supporte par défaut (fournisseur de sécurité Sun) les combinaisons suivantes :
Algorithme de condensé | Algorithme de chiffrement (clé) | Description |
---|---|---|
SHA1 | DSA | Pour les signatures définies dans documents FIPS PUB 186 |
MD2d123Remplacé par MD5 | RSA | pour les signatures conformes à PKCS#1 |
MD5 | RSA | pour les signatures conformes à PKCS#1 |
SHA1 | RSA | pour les signatures conformes à PKCS#1 |
La classe Java 2 correspondante est java.security.Signature
, qui permet de générer des signatures
(signer des données) et vérifier des signatures (des données signées).