Verschlüsselung von Bytes mit dem TPM (Trusted Platform Module)
Wie kann ich Bytes mit dem TPM-Modul eines Computers verschlüsseln?
CryptProtectDataWindows bietet eine (relativ) einfache API zum Verschlüsseln eines Blobs mit demCryptProtectData
API, mit der wir eine einfach zu verwendende Funktion verpacken können:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//...
}
Die Details vonProtectBytes
sind weniger wichtig als die Idee, dass Sie es ganz einfach verwenden können:
System
Gib mir den verschlüsselten Blob zurückDie zurückgegebenenKleck ist ein undokumentiertesDokumentatio Struktur, die alles enthält, was zum Entschlüsseln und Zurückgeben der Originaldaten erforderlich ist (Hash-Algorithmus, Verschlüsselungsalgorithmus, Salt, HMAC-Signatur usw.).
Der Vollständigkeit halber hier die Beispiel-Pseudocode-Implementierung vonProtectBytes
das benutzt dasCrypt API
um Bytes zu schützen:
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.
}
Wie mache ich dasselbe mit dem TPM?Der obige Code ist nur zum Verschlüsseln von Daten für den lokalen Computer nützlich. Die Daten werden mit dem @ verschlüsseSystem
account als Schlüsselgenerator Details sind zwar interessant, aber unwichtig). Das Endergebnis ist, dass ich Daten (z. B. einen Festplattenverschlüsselungs-Hauptschlüssel) verschlüsseln kann, die nur vom lokalen Computer entschlüsselt werden können.
etzt ist es Zeit, diesen Schritt weiter zu gehen. Ich möchte einige Daten verschlüsseln (z. B. einen Festplattenverschlüsselungs-Hauptschlüssel), die nur vom lokalen TPM entschlüsselt werden können. Mit anderen Worten, ich möchte die vertrauenswürdige Ausführungsumgebung von Qualcomm ersetzen TEE) im Blockdiagramm unten für Android mit dem TPM in Windows:
Hinwei: Mir ist klar, dass das TPM keine Datensignierung durchführt (oder, falls dies der Fall ist, nicht garantiert, dass das Signieren der gleichen Daten jedes Mal die gleiche Binärausgabe liefert). Welches ist, warum ich bereit wäre, @ zu ersetz "RSA-Signatur" mit "Verschlüsseln eines 256-Bit-Blobs mit einem hardwaregebundenen Schlüssel".
So wo ist der Code?Das Problem ist, dass die TPM-Programmierungollständig undokumentiert auf MS. Es ist keine API verfügbar, um Vorgänge auszuführen. Stattdessen müssen Sie sich eine Kopie des @ findTrusted Computing Group Software Stack (auch bekannt als TSS), finden Sie heraus, welche Befehle in welcher Reihenfolge mit Nutzdaten an das TPM gesendet werden sollen, und rufen Sie @ au Window's Tbsip_Submit_Command function um Befehle direkt zu senden:
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 verfügt über keine API höherer Ebene, um Aktionen auszuführen.
Es ist das moralische Äquivalent zum Versuch, eine Textdatei zu erstellen, indem Sie SATA-E / A-Befehle an Ihre Festplatte senden..
Warum nicht nur Hosen benutzenDie Trusted Computing Group (TCG) hat ihre eigene API definiert:TCB Software Stack (TSS). Eine Implementierung dieser API wurde von einigen Leuten erstellt und heißtHos. Ein Typ dannportierte das Projekt nach Windows.
Das Problem mit diesem Code ist, dass er nicht in die Windows-Welt portierbar ist. Sie können es beispielsweise nicht in Delphi und nicht in C # verwenden. Es benötigt
OpenSSL pThreadIch will nur dasCod um etwas mit meinem TPM zu verschlüsseln.
ObenstehendesCryptProtectData
erfordert nichts anderes als das, was sich im Funktionskörper befindet.
Was ist der entsprechende Code zum Verschlüsseln von Daten mit dem TPM? Wie andere angemerkt haben, Sie müssen wahrscheinlich die drei TPM-Handbücher konsultieren und die Blobs selbst erstellen. Es geht wahrscheinlich um dieTPM_seal
Befehl. Obwohl ich glaube, ich will nichtSiege Daten, ich denke, ich möchtebinde it:
Bindun - verschlüsselt Daten mit dem TPM-Bindungsschlüssel, einem eindeutigen RSA-Schlüssel, der von einem Speicherschlüssel abgeleitet ist.Abdichtun - verschlüsselt Daten auf ähnliche Weise wie beim Binden, gibt jedoch zusätzlich einen Zustand an, in dem TPM sein muss, damit die Daten entschlüsselt werden (entsiegelt)
Ich versuche, die drei erforderlichen Bände zu lesen, um die 20 benötigten Codezeilen zu finden:
Teil 1 - GestaltungsprinzipienTeil 2 - Strukturen des TPMTeil 3 - BefehleAber ich habeNei Idee, was ich lese. Wenn es ein Tutorial oder Beispiele gäbe, hätte ich vielleicht eine Chance. Aber ich bin völlig verloren.
So fragen wir StackoverflowAuf die gleiche Weise konnte ich Folgendes bereitstellen:
Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
//...
CryptProtectData(...);
//...
}
kann jemand das entsprechende Äquivalent bereitstellen:
Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
//...
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
//...snip...
Tbsip_Submit_Command(...);
//...
}
das tut dasselbe, außer dass ein Schlüssel in @ verriegelt iSystem
LSA, ist im TPM verriegelt?
Ich weiß nicht genau wasbinde meint. Betrachtet man jedoch TPM Main - Teil 3 Befehle - Spezifikation Version 1.2, wird @ erwähnbinde:
10.3 TPM_UnBind
TPM_UnBind nimmt das Daten-Blob, das das Ergebnis eines Tspi_Data_Bind-Befehls ist, und entschlüsselt es für den Export an den Benutzer. Der Anrufer muss die Verwendung des Schlüssels genehmigen, der den eingehenden Blob entschlüsselt. TPM_UnBind arbeitet blockweise und hat keine Ahnung, ob ein Block mit einem anderen in Beziehung steht.
Was verwirrend ist, ist da ist NeinTspi_Data_Bind
Befehl
Es ist entsetzlich, wie niemand sich jemals die Mühe gemacht hat, das TPM oder seinen Betrieb zu dokumentieren. Es ist, als ob sie all ihre Zeit damit verbracht hätten, sich dieses coole @ auszudenkeSach zu spielen, aber wollte nicht mit dem schmerzhaften Schritt, es zu machen, umgehenverwendba für etwas
Starten mit dem (jetzt) kostenlosen BuchEin praktischer Leitfaden zu TPM 2.0: Verwenden des Trusted Platform Module im neuen Zeitalter der Sicherheit:
Kapitel 3 - Kurzanleitung zu TPM 2.0Das TPM hat Zugriff auf einen selbst generierten privaten Schlüssel, sodass es Schlüssel mit einem öffentlichen Schlüssel verschlüsseln und den resultierenden Blob dann auf der Festplatte speichern kann. Auf diese Weise kann das TPM eine praktisch unbegrenzte Anzahl von Schlüsseln zur Verwendung bereithalten, jedoch keinen wertvollen internen Speicher verschwenden. Auf der Festplatte gespeicherte Schlüssel können gelöscht, aber auch gesichert werden, was den Designern als akzeptabler Kompromiss erschie
Wie kann ich einen Schlüssel mit dem öffentlichen Schlüssel des TPM verschlüsseln?
Kapitel 4 - Vorhandene Anwendungen, die TPMs verwendenAnwendungen, die das TPM verwenden sollten, aber nichtIn den letzten Jahren hat die Anzahl der webbasierten Anwendungen zugenommen. Dazu gehören webbasierte Sicherung und Speicherung. Eine große Anzahl von Unternehmen bietet solche Dienste an, aber unseres Wissens lässt keiner der Clients für diese Dienste den Benutzer den Schlüssel für den Sicherungsdienst für ein TPM sperren. Wenn dies geschehen wäre, wäre es sicherlich schön, wenn der TPM-Schlüssel selbst durch Duplizieren auf mehreren Computern gesichert würde. Dies scheint eine Gelegenheit für Entwickler zu sein.
Wie sperrt ein Entwickler einen Schlüssel für das TPM?
Kapitel 9 - ErbenUSE CASE: SPEICHERN VON LOGIN-PASSWÖRTERNEine typische Passwortdatei speichert gesalzene Hashes von Passwörtern. Die Überprüfung besteht darin, ein angegebenes Kennwort zu salzen, zu haschen und mit dem gespeicherten Wert zu vergleichen. Da die Berechnung kein Geheimnis enthält, wird die Kennwortdatei offline angegriffen.
In diesem Anwendungsfall wird ein von TPM generierter HMAC-Schlüssel verwendet. In der Kennwortdatei wird eine HMAC des gesalzenen Kennworts gespeichert. Die Überprüfung besteht aus dem Salzen und HMACen des angegebenen Passworts und dem Vergleich mit dem gespeicherten Wert. Da ein Offline-Angreifer nicht über den HMAC-Schlüssel verfügt, kann der Angreifer durch Ausführen der Berechnung keinen Angriff starten.
Dieskönnte Arbeit. Wenn das TPM einen geheimen HMAC-Schlüssel hat und nur mein TPM den HMAC-Schlüssel kennt, könnte ich "Signieren (auch TPM-Verschlüsselung mit privatem Schlüssel)" durch "HMAC" ersetzen. Aber dann kehrt er sich in der nächsten Zeile komplett um:
TPM2_Create, einen HMAC-Schlüssel angeben
Es ist kein TPM-Geheimnis, wenn ich den HMAC-Schlüssel angeben muss. Die Tatsache, dass der HMAC-Schlüssel nicht geheim ist, macht Sinn, wenn Sie feststellen, dass dies das Kapitel über kryptografische Dienstprogramme ist, die das TPM bereitstellt. Anstatt dass Sie selbst SHA2, AES, HMAC oder RSA schreiben müssen, können Sie wiederverwenden, was das TPM bereits herumliegt.
Kapitel 10 - SchlüsselAls Sicherheitsgerät die Fähigkeit einer Anwendung,erwenden Sie Schlüssel, während Sie sie in einem Hardwaregerät aufbewahre ist die größte Stärke des TPM. Das TPM kann extern generierte Schlüssel sowohl generieren als auch importieren. Es unterstützt sowohl asymmetrische als auch symmetrische Schlüssel.
Ausgezeichnet! Wie machst du das!
SchlüsselgeneratoDie größte Stärke des TPM ist wahrscheinlich die Fähigkeit, einen kryptografischen Schlüssel zu generieren und sein Geheimnis innerhalb einer Hardwaregrenze zu schützen. Der Schlüsselgenerator basiert auf dem Zufallszahlengenerator des TPM und ist nicht auf externe Zufallsquellen angewiesen. Auf diese Weise werden Schwachstellen beseitigt, die auf einer schwachen Software mit unzureichender Entropiequelle beruhe
Tut Ist das TPM in der Lage, kryptografische Schlüssel zu generieren und seine Geheimnisse innerhalb einer Hardwaregrenze zu schützen? Ist so, wie?
Kapitel 12 - PlattformkonfigurationsregisterPCRs zur AutorisierungUSE CASE: VERSCHLÜSSELUNG EINER FESTPLATTEN-VERSCHLÜSSELUNG FÜR PLATTFORM STATEAnwendungen für die Festplattenverschlüsselung sind weitaus sicherer, wenn ein TPM den Verschlüsselungsschlüssel schützt, als wenn er auf derselben Festplatte gespeichert ist, die nur durch ein Kennwort geschützt ist. Erstens verfügt die TPM-Hardware über einen Anti-Hammering-Schutz (eine detaillierte Beschreibung des TPM-Wörterbuch-Angriffsschutzes finden Sie in Kapitel 8), sodass ein Brute-Force-Angriff auf das Kennwort nicht praktikabel ist. Ein Schlüssel, der nur durch Software geschützt ist, ist weitaus anfälliger für ein schwaches Kennwort. Zweitens ist ein auf der Festplatte gespeicherter Softwareschlüssel viel einfacher zu stehlen. Nehmen Sie die Festplatte (oder ein Backup der Festplatte) und Sie erhalten den Schlüssel. Wenn ein TPM den Schlüssel enthält, muss die gesamte Plattform oder zumindest die Festplatte und das Motherboard gestohlen werden.
it @Sealing kann der Schlüssel nicht nur durch ein Kennwort, sondern auch durch eine Richtlinie geschützt werden. Eine typische Richtlinie sperrt den Schlüssel für die zum Zeitpunkt des Versiegelns aktuellen PCR-Werte (den Softwarestatus). Dies setzt voraus, dass der Status beim ersten Start nicht gefährdet ist. Jegliche vorinstallierte Malware, die beim ersten Start vorhanden ist, wird in den PCRs gemessen, und der Schlüssel wird somit an einen gefährdeten Softwarestatus gebunden. Ein weniger vertrauenswürdiges Unternehmen verfügt möglicherweise über ein Standard-Disk-Image und ein Siegel für PCRs, die dieses Image darstellen. Diese PCR-Werte würden auf einer vermutlich vertrauenswürdigeren Plattform vorberechnet. Ein noch komplexeres Unternehmen würde TPM2_PolicyAuthorize verwenden und mehrere Tickets bereitstellen, die eine Reihe vertrauenswürdiger PCR-Werte autorisieren. In Kapitel 14 finden Sie eine detaillierte Beschreibung der Richtlinienautorisierung und ihrer Anwendung zur Lösung des Problems der PCR-Sprödigkeit.
Auch wenn ein Kennwort den Schlüssel schützen kann, gibt es auch ohne ein TPM-Schlüsselkennwort einen Sicherheitsgewinn. Ein Angreifer konnte die Plattform starten, ohne ein TPMkey-Kennwort anzugeben, konnte sich jedoch nicht ohne den Benutzernamen und das Kennwort des Betriebssystems anmelden. Die OSsecurity schützt die Daten. Der Angreifer kann ein alternatives Betriebssystem, beispielsweise von einer Live-DVD oder einem USB-Stick, anstatt von der Festplatte starten, um die Anmeldesicherheit des Betriebssystems zu umgehen. Diese unterschiedliche Boot-Konfiguration und Software würde jedoch die PCR-Werte ändern. Da diese neuen PCRs nicht mit den versiegelten Werten übereinstimmen, gibt das TPM den Entschlüsselungsschlüssel nicht frei und die Festplatte konnte nicht entschlüsselt werden.
Ausgezeichnet! Dies ist genau der Anwendungsfall, den ich will. Es ist auch der Anwendungsfall, für den Microsoft das TPM verwendet. Wie mache ich es!
So habe ich das ganze Buch gelesen und es lieferte nichts Nützliches. Das ist ziemlich beeindruckend, weil es 375 Seiten hat. Sie fragen sich, was das Buch enthielt - und rückblickend habe ich keine Ahnung.
So geben wir die endgültige Anleitung zur Programmierung des TPM auf und wenden uns stattdessen einer Dokumentation von Microsoft zu:
Von demMicrosoft TPM Platform Crypto-Provider Toolkit. Es wird genau erwähnt, was ich tun möchte:
Der Endorsement Key oder EKDer EK wurde entwickelt, um eine zuverlässige kryptografische Kennung für die Plattform bereitzustellen. Ein Unternehmen verwaltet möglicherweise eine Datenbank der Endorsement Keys, die zu den TPMs aller PCs in seinem Unternehmen gehören, oder ein Data Center Fabric-Controller verfügt möglicherweise über eine Datenbank der TPMs in allen Blades. Unter Windows können Sie den im Abschnitt "Platform Crypto Provider in Windows 8" beschriebenen NCrypt-Anbieter verwenden, um den öffentlichen Teil des EK zu lesen.
Irgendwo im TPM befindet sich ein privater RSA-Schlüssel. Dieser Schlüssel ist dort eingesperrt - niemals von der Außenwelt gesehen zu werden. Ich möchte, dass das TPM etwas mit seinem privaten Schlüssel signiert (d. H. Mit seinem privaten Schlüssel verschlüsselt).
Also ich will am meistenBasi Operation, die möglicherweise vorhanden sein kann:
Encrypt etwas mit Ihrem privaten Schlüssel. Ich frage (noch) nicht einmal nach den komplizierteren Sachen:
"Abdichtung" es basiert auf PCR-StatusErstellen eines Schlüssels und Speichern in einem flüchtigen oder nichtflüchtigen SpeicherErstellen eines symmetrischen Schlüssels und Versuch, ihn in das TPM zu ladenIch frage nach der grundlegendsten Operation, die ein TPM ausführen kann. Warum ist es unmöglich, Informationen darüber zu erhalten, wie es geht?
Ich kann zufällige Daten bekommenIch nehme an, ich war ziemlich unzufrieden, als ich sagte, RSA-Signierung sei die grundlegendste Funktion, die das TPM ausführen kann. Dasdie meiste Grundlegend, dass das TPM aufgefordert werden kann, ist, mir zufällige Bytes zu geben.Da Ich habe herausgefunden, wie es geht:
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;
}
The Fancy ThingIch stelle fest, dass die Anzahl der Benutzer des TPM sehr gering ist. Deshalb hat niemand auf Stackoverflow eine Antwort. Deshalb kann ich nicht zu gierig werden, eine Lösung für mein gemeinsames Problem zu finden. Aber das Ding würde ichJa wirklic tun wollen, ist zu"Siegel" Daten
tellen Sie dem TPM einige Daten vor (z. B. 32 Byte Schlüsselmaterialenn das TPM die Daten verschlüsselt, wird eine undurchsichtige Blob-Struktur zurückgegebepäter fordern Sie das TPM auf, den Blob zu entschlüsseldie Entschlüsselung funktioniert nur, wenn die PCR-Register des TPM mit denen während der Verschlüsselung identisch sind.Mit anderen Worten
Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
//...
}
Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
//...
}
Cryptography Next Gen (Cng, aka BCrypt) unterstützt TPMie ursprüngliche Kryptografie-API in Windows wurde als Krypto-API bezeichne
Bei Windows Vista wurde die Crypto-API durch @ ersetzCryptography API: Next Generation (intern bekannt als BestCrypt, abgekürzt als BCrypt, nicht zu verwechseln mitder Passwort-Hashing-Algorithmus).
Windows wird mit zwei BCrypt @ ausgeliefe provider:
Microsoft Primitive Provider (MS_PRIMITIVE_PROVIDER
) Standar: Standardsoftwareimplementierung allerprimitives (Hashing, symmetrische Verschlüsselung, digitale Signaturen usw.)Microsoft Platform Crypto Provider (MS_PLATFORM_CRYPTO_PROVIDER
): Anbieter, der TPM-Zugriff bereitstelltDasPlattform Cryptoer @ -Anbieter ist nicht auf MSDN dokumentiert, verfügt jedoch über eine Dokumentation von einer 2012 Microsoft Research-Website:
TPM Platform Crypto-Provider ToolkitDer TPM-Plattform-Kryptoanbieter und das TPM-Toolkit enthalten Beispielcode, Dienstprogramme und Dokumentation zur Verwendung von TPM-bezogenen Funktionen in Windows 8. Zu den beschriebenen Subsystemen gehören der von TPM unterstützte Kryptoanbieter der nächsten Generation (CNG) und der Bestätigungsdienst Anbieter können die neuen Windows-Funktionen nutzen. Es werden sowohl TPM1.2- als auch TPM2.0-basierte Systeme unterstützt.
s scheint, dass Microsoft beabsichtigt, die TPM-Kryptofunktionalität mit demMicrosoft Platform Crypto Provider desCryptography NG API.
Verschlüsselung mit öffentlichem Schlüssel mit Microsoft BCryptGegeben, dass:
Ich möchte eine asymmetrische RSA-Verschlüsselung durchführen (mit dem TPM)MicrosoftBestCrypt unterstützt die asymmetrische RSA-VerschlüsselungMicrosoft BestCrypt hat einTPM ProviderEin Weg in die Zukunft könnte sein, herauszufinden, wie man mit dem @ -Zeichen digital signierMicrosoft Cryptography Next Gen API.
Mein nächster Schritt besteht darin, den Code für die Verschlüsselung in BCrypt mit einem öffentlichen RSA-Schlüssel unter Verwendung des Standardanbieters MS_PRIMITIVE_PROVIDER
). Z.B.
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 55publicExponent
: 65537Wenn dieser Code funktioniert, kann ich möglicherweise zur Verwendung des TPM-Providers wechseln MS_PLATFORM_CRYPTO_PROVIDER
).
2/22/2016: Und da Apple gezwungen ist, beim Entschlüsseln von Benutzerdaten mitzuwirken, besteht ein erneutes Interesse daran, wie das TPM die einfachste Aufgabe ausführen kann, für die es erfunden wurde - etwas zu verschlüsseln.
Es ist ungefähr gleichbedeutend mit jedem, der ein Auto besitzt, aber niemand weiß, wie man eines startet. Es kann wirklich nützliche und coole Dinge tun, wenn wir nur vorbei kommen könntenSchritt .
Bonus ReadingAndroid - Verschlüsselung - Speichern des verschlüsselten SchlüsselsAndroid Explorations - Überarbeitung der Android-FestplattenverschlüsselungDPAPI-Geheimnisse. Sicherheitsanalyse und Datenwiederherstellung in DPAPI (Teil 1)