2017-04-10 2 views
1

J'utilise AES pour créer des signatures HMAC pour les appels d'API et même si je comprends ce que sont les nonces et pourquoi elles sont importantes, je suis un peu confus sur leur signification exacte à mettre en œuvre. J'ai eu l'idée d'utiliser le nonce pour modifier la clé secrète d'un client pour générer une nouvelle clé à usage unique pour signer des appels qui pourraient être facilement exploités avec des attaques de rejeu.AES: Utiliser le nonce pour créer une nouvelle clé pour HMAC

Le prémisse de base est l'utilisateur, qui obtient une clé secrète lorsqu'il se connecte, appelle une procédure API d'installation qui crée et retourne un transactionID et un nouveau nonce. L'utilisateur combine alors sa propre clé secrète et le nonce pour signer le TransactionID et quelques autres choses. Le serveur essaie alors de faire correspondre cette signature en utilisant le nonce actuellement actif pour cet utilisateur. Le serveur efface automatiquement les anciennes factures et les écrase lorsque de nouveaux appels d'établissement sont effectués. L'utilisateur doit donc toujours suivre cette séquence appariée (vous ne pouvez pas réutiliser le second appel, car l'ancien appel a été supprimé et le serveur n'acceptera plus cette signature).

Si c'est la manière correcte d'utiliser nonces, comment puis-je les combiner avec les clés du client pour obtenir une clé secrète valide?

je produis des fournisseurs AES ainsi:

private static AesCryptoServiceProvider GetProvider(byte[] key, byte[] IV) 
    { 
     AesCryptoServiceProvider result = new AesCryptoServiceProvider(); 
     result.BlockSize = 128; 
     result.KeySize = 256; 
     result.Mode = CipherMode.CBC; 
     result.Padding = PaddingMode.PKCS7; 

     result.IV = IV; 
     result.Key = key; 

     return result; 
    } 

J'utilise AES-256 donc mes clés sont toujours 32 octets. Mais si je veux créer une nouvelle clé en utilisant un nonce, je ne peux pas simplement les concaténer car la chaîne résultante ne serait plus de 32 octets. Dois-je concaténer puis utiliser une fonction de hachage à longueur fixe pour obtenir le résultat dans une longueur de 32 octets? Ou existe-t-il un constructeur/une méthode AESCryptoServiceProvider qui gère automatiquement les nonces qui me manquent? Ou est-ce que je suis juste supposé ajouter des nonces en clair dans la signature et laisser le serveur les lire séparément et les vérifier directement?

+0

Si la réponse donnée a résolu votre problème, vous pouvez [accepter] (https://meta.stackexchange.com/q/5234/266187) le. Si ce n'est pas le cas, veuillez développer ce qui ne va pas. –

Répondre

1

Il existe plusieurs façons de résoudre ce problème. Le plus simple serait d'utiliser le hachage. Vous pouvez utiliser HMAC ou même HKDF.

SessionKey = HMAC_SHA256(SecretKey, Nonce) 

Assurez-vous d'utiliser SecretKey de l'utilisateur que pour dériver d'autres clés. Si vous souhaitez utiliser cette dérivation pour différentes choses, alors vous devez lier les utilisations dans la clé:

SessionKey = HMAC_SHA256(SecretKey, "Encryption".Concat(Nonce)) 
SessionToken = HMAC_SHA256(SecretKey, "Token".Concat(Nonce)) 

Ceci est juste pseudo-code. Here sont quelques exemples de HMAC réel en C#.