Comment chiffrer les octets en utilisant le module TPM (Trusted Platform Module))

Comment puis-je chiffrer des octets en utilisant le module TPM d'une machine?

CryptProtectData

Windows fournit une API (relativement) simple pour chiffrer un blob en utilisant l'API CryptProtectData , que nous pouvons envelopper une fonction facile à utiliser:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //...
}

Les détails de ProtectBytes sont moins importants que l'idée que vous pouvez l'utiliser assez facilement:

  • voici les octets que je veux cryptés par une clé secrète détenue dans le System
  • donnez-moi le chiffrés blob

la structure retournée blob est une structure non documentée documentation qui contient tout ce qui est nécessaire pour déchiffrer et retourner les données originales (algorithme de hachage, algorithme de chiffrement, sel, signature HMAC, etc).

Pour être complet, voici l'échantillon mise en œuvre du pseudo de ProtectBytes qui utilise le Crypt API pour protéger les octets:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //Setup our n-byte plaintext blob
   DATA_BLOB dataIn;
   dataIn.cbData = plaintext.Length;
   dataIn.pbData = Addr(plaintext[0]);

   DATA_BLOB dataOut;

   //dataOut = EncryptedFormOf(dataIn)
   BOOL bRes = CryptProtectData(
         dataIn,
         null,     //data description (optional PWideChar)
         null,     //optional entropy (PDATA_BLOB)
         null,     //reserved
         null,     //prompt struct
         CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE,
         ref dataOut);
   if (!bRes) then
   {
      DWORD le = GetLastError();
      throw new Win32Error(le, "Error calling CryptProtectData");
   }

   //Copy ciphertext from dataOut blob into an actual array
   bytes[] result;
   SetLength(result, dataOut.cbData);
   CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);

   //When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
   LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}

Comment faire la même chose avec le TPM?

le code ci-dessus est utile pour chiffrer des données pour la machine locale seulement. Les données sont cryptées en utilisant le compte System comme générateur de clés ( détails, bien qu'intéressants, sont sans importance ). Le résultat final est que je peux crypter des données (par exemple un maître de cryptage de disque dur la clé) qui ne peut être déchiffré par la machine locale.

il est temps de faire un pas de plus. Je veux crypter certaines données (par exemple une clé de cryptage de disque dur master) qui ne peuvent être décryptées que par la MPT locale. En d'autres termes, je veux remplacer L'environnement D'exécution de confiance Qualcomm ( TEE ) dans le schéma ci-dessous pour Android, avec le TPM dans Windows:

enter image description here

Note : je me rends compte que la TPM ne fait pas de signature de données (ou si elle le fait, elle ne garantit pas que la signature des mêmes données donnera la même sortie binaire à chaque fois). C'est pourquoi je serais prêt à remplacer "RSA signature" avec "le chiffrement de 256 bits, blob avec un matériel lié à la touche" .

alors où est le code?

le problème est que la programmation TPM est complètement sans-papiers sur MSDN . Aucune API n'est disponible pour effectuer des opérations. Au lieu de cela , vous devez vous trouver une copie de la pile de logiciels du Trusted Computing Group (alias TSS) , trouver quelles commandes Envoyer à la TPM, avec des charges utiles, dans quel ordre, et appeler Window Tbsip_Submit_Command fonction pour soumettre des commandes directement:

TBS_RESULT Tbsip_Submit_Command(
  _In_     TBS_HCONTEXT hContext,
  _In_     TBS_COMMAND_LOCALITY Locality,
  _In_     TBS_COMMAND_PRIORITY Priority,
  _In_     const PCBYTE *pabCommand,
  _In_     UINT32 cbCommand,
  _Out_    PBYTE *pabResult,
  _Inout_  UINT32 *pcbOutput
);

Windows n'a pas D'API de niveau supérieur pour effectuer des actions.

c'est l'équivalent moral d'essayer de créer un fichier texte en émettant des commandes SATA I/O sur votre disque dur .

pourquoi ne pas simplement utiliser un pantalon

le Trusted Computing Group (TCG) a défini sa propre API: TCB Software Stack (TSS) . Une implémentation de cette API a été créée par certains les gens, et est appelé pantalon . Un type alors porté ce projet à Windows .

le problème avec ce code est qu'il n'est pas portable dans le monde Windows. Par exemple, vous ne pouvez pas l'utiliser à partir de Delphi, vous ne pouvez pas l'utiliser à partir de C#. Il exige:

  • OpenSSL
  • pThread

je veux juste le code pour crypter quelque chose avec ma MPT.

ci-dessus CryptProtectData ne demande rien d'autre que ce qui est dans le corps de la fonction.

Quel est le code équivalent pour chiffrer les données en utilisant la MPT? Comme d'autres l'ont noté, vous devez probablement consulter les trois manuels de TPM, et construire les blobs vous-même . Il s'agit probablement de la commande TPM_seal . Bien que je pense que je ne veux pas sceau données, je pense Je veux lier :

reliure – chiffrement des données à l'aide de la clé TPM bind, une clé RSA unique issue d'une clé de stockage. d'Étanchéité – crypte les données d'une manière similaire à la liaison, mais en plus spécifie un état dans lequel TPM doit être en ordre pour le déchiffrement des données (non scellé)

j'essaie de lire les trois volumes dans l'ordre pour trouver les 20 lignes de code dont j'ai besoin:

  • Partie 1 - Principes De Conception
  • Partie 2 - les Structures de la TPM
  • Partie 3-Commandes

mais j'ai Non idée de ce que je lis. S'il y avait un tutoriel ou des exemples, j'aurais peut-être une chance. Mais je suis complètement perdu.

nous demandons donc Stackoverflow

de la même manière que j'ai pu fournir:

Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
   //...
   CryptProtectData(...); 
   //...
}

peut quelqu'un Fournir l'équivalent correspondant:

Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
   //...
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   //...snip...
   Tbsip_Submit_Command(...);
   //...
}

qui fait la même chose, sauf que plutôt qu'une clé verrouillée dans System LSA, est verrouillé dans le TPM?

début de la recherche

Je ne sais pas exactement ce que lient signifie. Mais en regardant TPM Main - Partie 3 commandes-Spécification version 1.2, il y a une mention de bind :

10.3 TPM_UnBind

TPM_UnBind prend le blob de données qui est le résultat d'une commande Tspi_Data_Bind et le déchiffre pour l'exportation à l'utilisateur. L'appelant doit autoriser l'utilisation de la clé qui décryptera le blob entrant. TPM_UnBind opère sur un bloc par bloc, et n'a aucune notion de la relation entre un bloc et de l'autre.

ce qui est confus est là est Non Tspi_Data_Bind commande.

Effort De Recherche

il est épouvantable que personne n'ait jamais pris la peine de documenter la MPT ou son fonctionnement. C'est comme s'ils passaient tout leur temps à venir avec ce cool chose pour jouer avec, mais n'a pas vous voulez faire face à l'étape douloureuse de le faire utilisable pour quelque chose.

à partir du (Maintenant) Livre Gratuit un Guide pratique pour TPM 2.0: Utilisation du Module plate-forme de confiance dans la nouvelle ère de la sécurité :

Chapitre 3-tutoriel rapide sur TPM 2.0

le MPT a accès à une clé privée générée par lui-même, de sorte qu'il peut chiffrer touches avec une clé publique, puis stocker le blob sur le disque dur. De cette façon, le MPT peut garder un nombre virtuellement illimité de clés disponibles pour l'utilisation, mais ne pas gaspiller précieux stockage interne. Les clés stockées sur le disque dur peuvent être effacés, mais ils peuvent également être sauvegardées, ce qui semblait les concepteurs comme un compromis acceptable.

Comment puis-je chiffrer une clé avec la clé publique de la MPT?

Chapitre 4-Existing Applications Qui Utilisent Des MPT

Applications Qui Doivent Utiliser le TPM, mais Ne le font pas

au cours des dernières années, le nombre d'applications Web a augmenté. Parmi eux sont la sauvegarde et le stockage sur le web. Un grand nombre d'entreprises offrent maintenant de tels services, mais pour autant que nous le sachions, aucun des clients pour ces services ne permettent à l'utilisateur de verrouiller la clé pour le service de sauvegarde à une MPT. Si cela était fait, ce serait certainement bien si le TPM la clé elle-même a été sauvegardée en la dupliquant sur plusieurs machines. Cela semble être une opportunité pour les développeurs.

comment un développeur verrouille-t-il une clé à la MPT?

Chapitre 9-Hérarchies

USE CASE: STORING LOGIN PASSWORDS

un fichier de mots de passe typique stocke des hachures salées de mots de passe. La vérification consiste en un salage et un malaxage a fourni mot de passe et de le comparer à la valeur stockée. Parce que le calcul ne comprend pas un secret, il est sujet à une attaque hors ligne sur le fichier de mot de passe.

ce cas d'Utilisation utilise une clé HMAC générée par MPT. Le fichier de mots de passe stocke un HMAC du mot de passe salé. La vérification consiste à saler et à Hmacer le mot de passe fourni et à le comparer à la valeur stockée. Parce qu'un attaquant hors ligne n'a pas la clé HMAC, l'attaquant ne peut pas monter une attaque en exécutant calcul.

Ce pourrait de travail. Si la MPT a une clé HMAC secrète, et que seule ma MPT connaît la clé HMAC, alors je pourrais remplacer "signe (alias MPT encrypt with it's private key)" par "HMAC". Mais ensuite, dans la ligne suivante, il s'inverse complètement:

TPM2_Create, en spécifiant une clé HMAC

ce n'est pas un secret de TPM SI je dois spécifier HMAC key. Le fait que la clé HMAC n'est pas secrète a du sens quand vous réalisez que c'est le chapitre sur les utilitaires cryptographiques que la MPT fournit. Plutôt que D'avoir à écrire SHA2, AES, HMAC, ou RSA vous-même, vous pouvez réutiliser ce que le TPM a déjà autour.

Chapitre 10-Clés

comme un dispositif de sécurité, la capacité d'une application à utiliser des clés tout en les gardant en sécurité dans un dispositif matériel est la plus grande force de la TPM. La MPT peut à la fois générer et importer des clés générées de l'extérieur. Il supporte les clés asymétriques et symétriques.

Excellent! Comment fais-tu!?

Générateur De Clés

sans doute, la plus grande force de la MPT est sa capacité à générer une clé cryptographique et à protéger son secret à l'intérieur d'une frontière matérielle. Le générateur de clés est basé sur Le propre générateur de nombres aléatoires de TPM et ne s'appuie pas sur des sources externes d'aléatoire. Il élimine ainsi les faiblesses basées sur des logiciels faibles avec une source insuffisante d'entropie.

Ne la TPM ont la capacité de générer des clés de chiffrement et de protéger ses secrets à l'intérieur d'un matériel de limite? Est oui, comment?

Chapitre 12-Registres De Configuration De Plate-Forme

Rap pour Autorisation

USE CASE: SEALING A HARD DISK ENCRYPTION KEY TO PLATFORM STATE

les applications de chiffrement sur disque complet sont beaucoup plus sûres si une MPT protège la clé de chiffrement que si elle est stockée sur le même disque, protégée seulement par un mot de passe. Tout d'abord, le matériel TPM dispose d'une protection anti-martelage (voir Chapitre 8 pour une description détaillée de la protection d'attaque du dictionnaire TPM), ce qui rend une attaque par la force brute sur le mot de passe impossible. Une clé protégée uniquement par un logiciel est beaucoup plus vulnérable à un mot de passe faible. Deuxièmement, une clé de logiciel stocké sur le disque est beaucoup plus facile à voler. Prendre le disque (ou une sauvegarde du disque), et vous obtenez la clé. Quand une MPT tient la clé, toute la plateforme, ou au moins le disque et la carte mère, doit être volée.

La fermeture

permet de protéger la clé non seulement par un mot de passe, mais aussi par une politique. Une politique typique verrouille la clé des valeurs PCR (la état du logiciel) courant au moment de la fermeture. Cela suppose que l'état au premier démarrage n'est pas compromise. Tout malware préinstallé présent au premier démarrage serait mesuré dans le PCRs, et donc la clé serait scellé à un État de logiciel compromis. Une entreprise moins confiante pourrait avoir une image disque standard et un sceau à PCRs représentant cette image. Ces valeurs de PCR seraient calculées à l'avance sur une plate-forme probablement plus fiable. Une entreprise encore plus sophistiquée utiliserait TPM2_PolicyAuthorize, et de fournir plusieurs billets d'autoriser une série de confiance PCR des valeurs. Voir le Chapitre 14 pour une description détaillée de la Politique autoriser et de son application pour résoudre le problème de PCR-Birtleness.

bien qu'un mot de passe puisse aussi protéger la clé, il y a un gain de sécurité même sans mot de passe de clé MPT. Un attaquant pourrait démarrer la plate-forme sans fournir de mot de passe TPMkey, mais ne pourrait pas se connecter sans le nom D'utilisateur et le mot de passe du système D'exploitation. Le OSsecurity protège les données. L'attaquant pourrait démarrer un OS alternatif, par exemple à partir d'un DVD live ou d'une clé USB plutôt que depuis le disque dur, pour contourner la sécurité de connexion OS. Cependant, cette configuration et ce logiciel de démarrage différents changeraient les valeurs de PCR. Parce que ces nouveaux PCR ne correspondraient pas aux valeurs scellées, la MPT ne libérerait pas la clé de déchiffrement, et le disque dur ne pourrait pas être déchiffré.

Excellent! C'est exactement le cas d'utilisation que je veux. C'est aussi le cas D'utilisation pour lequel Microsoft utilise la MPT. Comment puis-je le faire!?

donc j'ai lu ce livre entier, et il n'a rien fourni d'utile. Ce qui est assez impressionnant parce que c'est 375 pages. Vous vous demandez ce que contenait le livre - et en y repensant, je n'en ai aucune idée.

donc nous abandonnons sur le guide définitif de programmation de la TPM, et tourner à la place à une certaine documentation de Microsoft:

du Microsoft TPM Plate-forme de Crypto-Fournisseur de la boîte à outils . Il mentionne exactement ce que je veux faire:

L'Approbation de la Clé ou EK

L'EK est conçu pour fournir un identificateur cryptographique fiable pour la plate-forme. Une entreprise pourrait tenir à jour une base de données des clés D'approbation appartenant aux MPT de tous les ordinateurs de son entreprise, ou un contrôleur de tissu de Centre de données pourrait avoir un base de données des TPMs dans toutes les pales. Sur Windows, vous pouvez utiliser le fournisseur NCrypt décrit dans la section "plate-forme Crypto Provider in Windows 8" pour lire la partie publique de L'EK.

quelque part à l'intérieur de la MPT est une clé privée RSA. Cette clé est enfermé dans il - ne jamais être vu par le monde extérieur. Je veux que la MPT signe quelque chose avec sa clé privée (c'est-à-dire qu'elle le crypte avec sa clé privée).

donc je veux le plus opération de base opération qui peut éventuellement exister:

enter image description here

chiffrez quelque chose avec votre clé privée. Je ne demande même pas (encore) les choses les plus compliquées:

  • "scellage " it basé sur L'état PCR
  • la création d'une clé et de les stocker dans volatiles ou non volatiles memroy
  • créant un clé symétrique et d'essayer de le charger dans le module de plateforme sécurisée

je demande l'opération la plus élémentaire qu'une MPT puisse faire. Pourquoi est-il impossible d'obtenir des informations sur la façon de le faire?

je peux obtenir des données aléatoires

je suppose que j'étais désinvolte quand j'ai dit que la signature RSA était la chose la plus élémentaire que la MPT puisse faire. Le le plus la chose de base que L'on peut demander à la MPT est de me donner des octets aléatoires. j'ai trouvé comment faire:

public Byte[] GetRandomBytesTPM(int desiredBytes)
{
   //The maximum random number size is limited to 4,096 bytes per call
   Byte[] result = new Byte[desiredBytes];

   BCRYPT_ALG_HANDLE hAlgorithm;

   BCryptOpenAlgorithmProvider(
         out hAlgorithm,
         BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG"
         MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" i.e. the TPM
         0 //Flags
   );
   try
   {                
      BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0);
   }
   finally
   {
      BCryptCloseAlgorithmProvider(hAlgorithm);
   }

   return result;
}

La Fantaisie Chose

je me rends compte que le nombre de personnes utilisant la MPT est très faible. C'est pourquoi personne sur Stackoverflow n'a de réponse. Donc je ne peux pas être trop gourmand pour trouver une solution à mon problème commun. Mais la chose que je vraiment veux faire est de "sceau quelques données:

enter image description here

  • présente le module de plateforme sécurisée des données (par exemple, 32 octets de la clé matérielle)
  • avoir le TPM encrypt les données, retournant une structure de blob opaque
  • plus tard, demander au TPM de décrypter le blob
  • le déchiffrement ne fonctionnera que si les registres PCR de la MPT sont les mêmes que pendant le chiffrement.

en d'autres termes:

Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
   //...
}

Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
   //...
}

Cryptographie Next Gen (Cng, alias BCrypt) prend en charge TPM

L'API cryptographique d'origine de Windows était connue sous le nom D'API Crypto.

à partir de Windows Vista, L'API de Crypto a été remplacé par API de cryptographie: nouvelle génération (internally known as BestCrypt , Abrégé en BCrypt , à ne pas confondre avec le algorithme de hachage de mot de passe ).

Windows est livré avec deux BCrypt fournisseurs :

  • Microsoft Primitive Provider ( MS_PRIMITIVE_PROVIDER ) par défaut : implémentation logicielle par défaut de toutes les primitives (hachage, cryptage symétrique, signatures numériques, etc)
  • Plate-Forme Microsoft Fournisseur de Crypto ( MS_PLATFORM_CRYPTO_PROVIDER ): fournisseur qui fournit l'accès TPM

le plate-forme Crypto fournisseur n'est pas documenté sur MSDN, mais a la documentation d'un 2012 Microsoft Research site:

TPM Plate-forme de Crypto-Fournisseur de la boîte à outils

la plateforme TPM Crypto Provider and Toolkit contient un exemple de code, des utilitaires et de la documentation pour l'utilisation des fonctionnalités liées aux MPT dans Windows 8. Les sous-systèmes décrits comprennent la plate-forme crypto-Next-Gen (CNG) crypto-provider (fournisseur de services crypto-Next-Gen) à base de MPT, et la façon dont les fournisseurs de services d'attestation peuvent utiliser les nouvelles fonctionnalités de Windows. Les deux TPM1.2 et TPM2.Les systèmes basés sur 0 sont pris en charge.

il semble que L'intention de Microsoft est de surface TPM crypto fonctionnalité avec le Microsoft plate-forme Crypto Fournisseur de la Cryptographie NG API.

chiffrement à clé Publique à l'aide de Microsoft BCrypt

étant donné que:

  • je veux faire des RSA le chiffrement asymétrique (à l'aide de la TPM)
  • Microsoft BestCrypt prend en charge le cryptage asymétrique RSA
  • Microsoft BestCrypt a un TPM Provider

une façon d'aller de l'avant pourrait être de comprendre comment faire la signature numérique en utilisant le Microsoft Cryptography Next Gen API .

ma prochaine étape sera de trouver le code pour faire le cryptage en BCrypt, avec une clé publique RSA, en utilisant le fournisseur standard ( MS_PRIMITIVE_PROVIDER ). Par exemple:

  • modulus : 0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 4F 40 9F D2 D1 69 FB 995D 85 0C 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 de 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55
  • publicExponent : 65537

avec ce code fonctionnel, je pourrais peut-être passer à l'utilisation du fournisseur de MPT ( MS_PLATFORM_CRYPTO_PROVIDER ).

2/22/2016: et avec Apple étant contraint d'aider à déchiffrer les données de l'utilisateur, Il ya un regain d'intérêt dans la façon de faire le TPM effectuer la tâche la plus simple qu'il a été inventé pour - encrypting quelque chose.

c'est à peu près l'équivalent de tout le monde possédant une voiture, mais personne ne sait comment en démarrer une. Il peut faire des choses vraiment utiles et cool, si seulement nous pouvions passer Étape 1 .

Lecture De Bonus

  • Android - cryptage-stockage de la clé cryptée
  • Android Explorations - Revoir Android de chiffrement de disque
  • DPAPI Secrets. L'analyse de la sécurité et de la récupération des données dans DPAPI (Partie 1)
93
demandé sur Community 2015-03-04 22:06:27

3 réponses

Primer

Tout ce qui suit est d'environ TPM 1.2. Gardez à l'esprit que Microsoft a besoin D'un MPT 2.0 pour toutes les versions futures de Windows. La génération 2.0 est fondamentalement différente de la 1.2

il n'y a pas de solution monoligne en raison des principes de conception des MPT. Pensez à la MPT comme un microcontrôleur avec des ressources limitées. Son principal objectif était d'être bon marché, tout en restant sûr. Ainsi, la MPT a été déchiré de toute logique qui n'était pas nécessaire pour un la sécurité de fonctionnement. Ainsi, une MPT ne fonctionne que lorsque vous avez au moins quelques logiciels plus ou moins fat , qui émettent beaucoup de commandes dans le bon ordre. Et ces séquences de commandes peuvent devenir très complexes. C'est pourquoi TCG a spécifié le TSS avec une API bien définie. Si vous souhaitez aller à La Java way, Il ya même un haut niveau API Java . Je ne suis pas au courant d'un projet similaire pour C# / .net

développement

dans votre cas, je vous suggère de regarder le logiciel TPM D'IBM.

dans le paquet vous trouverez 3 composants très utiles:

  • un logiciel TPM émulateur
  • un léger tpm lib
  • quelques commandes de base utilitaires de ligne de

vous n'avez pas nécessairement besoin du logiciel TPM émulateur, vous pouvez également vous connecter à la HW TPM de la machine. Cependant, vous pouvez intercepter les commandes émises et regarder les réponses, ainsi apprendre comment ils sont assemblés et comment ils correspondent à la spécification de commande.

"151950920 de" Haut niveau

conditions préalables:

  1. TPM est activé
  2. TPM driver est chargé
  3. vous avez pris possession de la TPM

pour sceller un blob, vous devez faire ce qui suit:

  1. créer une clé
  2. stocker la clé de blob quelque part
  3. s'assurer que la clé est chargée dans la MPT
  4. sceller le blob

pour desceller vous devez:

  1. obtenir la clé-blob
  2. charger la clé pour le module de plateforme sécurisée
  3. desceller les scellés blob

vous pouvez stocker la clé-blob dans votre structure de données que vous utilisez pour stocker les octets protégés.

la plupart des commandes MPT dont vous avez besoin sont autorisées. Par conséquent, vous devez établir des séances d'autorisation au besoin. Ce sont surtout des sessions OSAP.

commandes TPM

actuellement Je ne peux pas lancer une version de débogage, donc je ne peux pas vous fournir la séquence exacte. Donc, considérez ceci comme une unordered liste de commandes que vous devrez utiliser:

  • TPM_OSAP
  • TPM_CreateWrapKey
  • TPM_LoadKey2
  • TPM_Seal

si vous voulez lire les valeurs PCR actuelles, aussi:

  • TPM_PCRRead
5
répondu Scolytus 2015-05-28 09:43:36

clés de confiance et cryptées

les clés de confiance et cryptées sont deux nouveaux types de clés ajoutés au noyau existant service porte-clés. Ces deux nouveaux types sont des clés symétriques de longueur variable., et dans les deux cas, toutes les clés sont créées dans le noyau et l'espace utilisateur voit, stocke et charge uniquement des blobs cryptés. Clés sécurisées nécessitent la disponibilité d'un Module de plate-forme de confiance (TPM) puce pour une plus grande sécurité, tout en crypté Les touches peuvent être utilisées sur n'importe quel système. Tout le niveau de l'utilisateur gouttes, sont chargés dans hex ascii pour la commodité, et sont l'intégrité vérifiée.

Les clés de confiance

utilisent une MPT à la fois pour générer et pour sceller les clés. Les touches sont scellés sous une clé RSA de 2048 bits dans le MPT, et optionnellement scellé à la PCR spécifiée valeurs (mesure de l'intégrité), et uniquement non scellées par la MPT, si PCRs et blob les vérifications d'intégrité correspondent. Une clé de confiance chargée peut être mise à jour avec de nouveaux (future) valeurs PCR, de sorte que les clés sont facilement migrées vers de nouvelles les valeurs pcr, telles que lorsque le noyau et initramfs sont mis à jour. La même clé peut en sauver beaucoup blobs sous différentes valeurs PCR, donc plusieurs bottes sont facilement supportées.

par défaut, les clés de confiance sont scellées sous le SRK, qui a la valeur par défaut valeur d'autorisation (20 zéros). Cela peut être réglé au moment de la prise de possession avec le utilité du pantalon: tpm_takeownership -u -z .

Usage:
    keyctl add trusted name "new keylen [options]" ring
    keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring
    keyctl update key "update [options]"
    keyctl print keyid

    options:
    keyhandle= ascii hex value of sealing key default 0x40000000 (SRK)
    keyauth=   ascii hex auth for sealing key default 0x00...i
        (40 ascii zeros)
    blobauth=  ascii hex auth for sealed data default 0x00...
        (40 ascii zeros)
    blobauth=  ascii hex auth for sealed data default 0x00...
        (40 ascii zeros)
    pcrinfo=   ascii hex of PCR_INFO or PCR_INFO_LONG (no default)
    pcrlock=   pcr number to be extended to "lock" blob
    migratable= 0|1 indicating permission to reseal to new PCR values,
                default 1 (resealing allowed)

keyctl print retourne une copie ascii hexadécimale de la clé scellée, qui est dans la norme Format TPM_STORED_DATA. La longueur des clés pour les nouvelles clés est toujours en octets. Les clés de confiance peuvent être 32 - 128 octets (256 - 1024 bits), la limite supérieure doit s'adapter dans le 2048 bit SRK (RSA) keylength, avec toute la structure nécessaire / rembourrage.

les clés cryptées ne dépendent pas d'une MPT et sont plus rapides, car elles utilisent AES pour chiffrement/déchiffrement. Les nouvelles clés sont créées à partir du noyau généré au hasard les numéros, et sont cryptés / déchiffrés à l'aide d'une clé 'master' spécifiée. Le la clé "maître" peut être de type clé de confiance ou Clé utilisateur. Principal l'inconvénient des clés cryptées est que si elles ne sont pas enracinées dans une clé de confiance, ils sont seulement aussi sûrs que la clé utilisateur les cryptant. La clé d'utilisateur principale devrait donc être chargé dans aussi sécurisé que possible, de préférence au début démarrage.

la partie déchiffrée des clés cryptées peut contenir soit une simple clé symétrique clé ou structure plus complexe. Le format de la structure plus complexe être spécifique à l'application, qui est identifiée par "format".

Usage:
    keyctl add encrypted name "new [format] key-type:master-key-name keylen"
        ring
    keyctl add encrypted name "load hex_blob" ring
    keyctl update keyid "update key-type:master-key-name"

format:= 'default | ecryptfs'
key-type:= 'trusted' | 'user'

exemples d'utilisation de clés cryptées et de confiance

créer et sauvegarder une clé de confiance appelée "kmk" de longueur 32 octets:

$ keyctl add trusted kmk "new 32" @u
440502848

$ keyctl show
Session Keyring
       -3 --alswrv    500   500  keyring: _ses
 97833714 --alswrv    500    -1   \_ keyring: _uid.500
440502848 --alswrv    500   500       \_ trusted: kmk

$ keyctl print 440502848
0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
e4a8aea2b607ec96931e6f4d4fe563ba

$ keyctl pipe 440502848 > kmk.blob

chargez une clé de confiance à partir du blob sauvé:

$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824

$ keyctl print 268728824
0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
e4a8aea2b607ec96931e6f4d4fe563ba

Resceller une clé de confiance en vertu de la nouvelle pcr des valeurs:

$ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`"
$ keyctl print 268728824
010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805
77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73
d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e
df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4
9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6
e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610
94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9
7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef
df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8

le premier consommateur de clés de confiance est EVM, qui, au moment du démarrage a besoin d'un haut clé symétrique de la qualité pour la protection des métadonnées des fichiers par le HMAC. L'utilisation d'un la clé trusted offre de solides garanties que la clé EVM n'a pas été compromis par un problème au niveau de l'utilisateur, et lorsqu'il est scellé à une PCR de démarrage spécifique valeurs, protège contre les attaques de démarrage et hors ligne. Créer et sauvegarder un clé cryptée "evm" utilisant la clé de confiance ci-dessus "kmk":

option 1: omission "format"

$ keyctl add encrypted evm "new trusted:kmk 32" @u
159771175

option 2: explicitement la définition de "format" comme "par défaut"

$ keyctl add encrypted evm "new default trusted:kmk 32" @u
159771175

$ keyctl print 159771175
default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
24717c64 5972dcb82ab2dde83376d82b2e3c09ffc

$ keyctl pipe 159771175 > evm.blob

Charger une clé chiffrée "evm" de l'sauvé blob:

$ keyctl add encrypted evm "load `cat evm.blob`" @u
831684262

$ keyctl print 831684262
default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
24717c64 5972dcb82ab2dde83376d82b2e3c09ffc

autres utilisations des clés de confiance et cryptées, telles que le cryptage des disques et des fichiers sont prévus. En particulier, le nouveau format de ecryptfs " a été défini dans afin d'utiliser des clés cryptées pour monter un système de fichiers encryptfs. Plus de détails à propos de l'utilisation peuvent être trouvés dans le fichier Documentation/sécurité/keys-ecryptfs.txt'.

4
répondu chandana 2015-05-28 16:10:29

quand il est écrit

spécifiant la clé HMAC

cela ne signifie pas fournir la clé HMAC - cela signifie " pointer vers la clé HMAC que vous voulez utiliser " .

TPMs peut utiliser un nombre virtuellement illimité de clés HMAC, comme il est souligné dans le livre. Tu dois dire à la MPT laquelle utiliser.

1
répondu DCC 2016-06-15 13:39:28