Geschrieben von: Christian Koller
Kategorie: Sicherheit
This printed page brought to you by AlphaSierraPapa
Man kann in ASP Seiten mit Hilfe einer Komponente Texte mittels PGP ver- und entschlüsseln. Leider ist mir keine ActiveX-Komponente bekannt, die diese Funktionalität direkt integriert hat. Jedoch kann man die Funktionalität der NSDPGP Komponente dazu benutzen, um beliebige PGP-verschlüsselte Texte zu entschlüsseln, oder Texte mittels PGP zu verschlüsseln.
Die Installation und Verwendung der NSDPGP Komponente können Sie im Artikel PGP-Verschlüsselung bei Dateien nachlesen.
Die NSDPGP Komponente erlaubt es, Dateien mittels PGP zu verschlüsseln. Außerdem kann man Dateien, die mittels PGP verschlüsselte Text enthalten, mit der NSDPGP Komponente wieder entschlüsseln.
Leider kann NSDPGP nur Dateien und keine Textstrings direkt bearbeiten. Sowohl der verschlüsselte als auch der entschlüsselte Text müssen auf der Festplatte liegen, egal ob man mittels NSDPGP eine PGP-Verschlüsselung oder eine PGP-Entschlüsselung durchführt.
Man kann aber unter ASP einen beliebigen Text auf der Festplatte speichern. Dies ermöglicht das FileSystemObject Objekt, das fixer Bestandteil von VBScript und JScript ist - damit kann man in ASP Dateien schreiben und wieder lesen. Daher ist es, wenn auch über Umwege, möglich, mittels ASP beliebige Texte mittels PGP zu manipulieren.
Damit eine ASP Seite überhaupt die PGP Algorithmen anwenden kann, muß sowohl PGP (Version 6.5.1 oder höher) sowie die NSDPGP Komponente am Webserver installiert sein.
Das folgende ASP-Skript benutzt den PGP Schlüssel "TestPGP <testpgp@aspexpert.com>" mit der Key ID=0xD6863683 um einen vom User eingegebenen Text zu verschlüsseln. Der PGP Key ist im Download zu diesem Artikel in der Datei TestPGP.asc enthalten, wobei der darin enthaltene Schlüssel mittels Doppelklick auf die Datei in die am Computer installierten PGP Keys übernommen werden kann. Die Passphrase für den Schlüssel ist "Pass".
Natürlich können Sie auch einen anderen PGP Key zur Verschlüsselung benutzen. Dazu muß der "Private Key" des PGP Keys am Webserver vorhanden sein. Die PGP Key IDs können Sie im Programm PGPKeys (in der Programmgruppe PGP des Start Menüs) herausfinden, indem Sie mit der rechten Maustaste auf einen Schlüssel klicken und Key Properties wählen.
Das folgenden Skript nimmt die Usereingaben (PGP Key ID, Passphrase und zu verschlüsselnder Text) entgegen. Der Text wird in eine Datei auf die Festplatte geschrieben, dort mittels NSDPGP Komponente verschlüsselt und in einer anderen Datei gespeichert.
Die verschlüsselte Ergebnisdatei wird vom ASP Skript ausgelesen und beide temporären Dateien mittels NSDPGP unwiederbringlich gelöscht.
Das nachfolgende Listing ist ein Auszug aus dem Skript encodepgp.asp, dessen Sourcecode Sie im Download finden:
<% @LANGUAGE="VBscript" %> <% ' Funktionen zum PGP Ver- und Entschluesseln: Function EncodePGP(strText, PGPKey, ByRef strPGPEncodedText) Dim FolderPhys, FileNameSource, FileNameEnc Dim FilePhysSource, FilePhysEnc Dim bWrite, bRead ' Dateiordner, in dem die Dateien temporaer gespeichert werden: FolderPhys = "C:\Temp\" FileNameSource = GetTempFileName FileNameEnc = FileNameSource & ".pgp" FilePhysSource = FolderPhys & FileNameSource FilePhysEnc = FolderPhys & FileNameEnc bWrite = WriteTextFile(FilePhysSource, strText) EncodePGPFile FilePhysSource, FilePhysEnc, PGPKey bRead = ReadTextFile(FilePhysEnc, strPGPEncodedText) ' Aufraeumen If bWrite Then PGPWipeFile FilePhysSource End If If bRead Then PGPWipeFile FilePhysEnc End If EncodePGP = bRead And bWrite End Function ' ---------------------------------------------------- Function EncodePGPFile(FileNameSource, FileNameEnc, PGPKey) Dim objPGP ' PGP Objekt instanzieren Set objPGP = CreateObject("NSDPGP") ' Datei mit PGP verschluesseln ' Syntax: objPGP.EncryptFileEx Signfile, _ ' Quelldatei, PGP_ErgebnisDatei, Paßwort ' Anmerkung: Der Inhalt des Paßworts wird ' nur benoetigt um den Inhalt mittels PGP zu "signen" objPGP.EncryptFileEx PGPKey, "NOSIGN", _ FileNameSource , FileNameEnc, "" Set objPGP = Nothing End Function ' ---------------------------------------------------- Function PGPWipeFile(FileName) Set objPGP = CreateObject("NSDPGP") ' Datei unwiederbringlich loeschen objPGP.WipeFile FileName Set objPGP = Nothing End Function ' ... ' ---------------------------------------------------- ' Hauptprogramm: ' ---------------------------------------------------- Dim strPassphrase, strText, strPGPText If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then isPostBack = True strText = Trim(Request.Form("Text")) strPGPKeyID = Trim(Request.Form("PGPKeyID")) Else isPostBack = False strText = "Dieser Text wird mittels PGP verschluesselt!" strPGPKeyID = "0xD6863683" End If If isPostBack = False then ' Formular ausgeben: %> <form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" method="POST"> PGP Key ID: <input type="Text" name="PGPKeyID" value="<%= strPGPKeyID %>"> <br> <textarea name="text" cols="40" rows="10" wrap="VIRTUAL"><%= strText %> </textarea><br> <input type="Submit" name="Submit" value="Submit"> </form> <% Else ' Text verschluesseln und darstellen bOK = EncodePGP(strText, strPGPKeyID, strPGPText) If bOK Then Response.Write("<b>Der verschlüsselte Text lautet:" & _ "</b><BR><br>") Response.Write("<pre>" & strPGPText & "</pre>") Else Response.Write("Es ist ein Fehler aufgetreten, " & _ "der Text konnte nicht verschlüsselt werden!<BR>") End If Response.Write("<BR>") Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _ """>Zurück</a>") End If %>
Dieses ASP Skript übernimmt die vom Benutzer geposteten Eingaben (PGP Key ID, Passphrase und Text wie in Bild 1 dargestellt) und ruft die Funktion EncodePGP auf, die sich um die Verschlüsselung des Textes kümmert.
Bild 1: Eingabeformular zum Verschlüsseln des Textes
EncodePGP schreibt den zu verschlüsselnden Text mittels der Funktion WriteTextFile in eine Datei (FilePhysSource). Der Aufruf der Funktion EncodePGPFile bewirkt, daß die unverschlüsselte Datei (FilePhysSource) von der NSDPGP Komponente verschlüsselt, und der verschlüsselte Text in eine weitere Datei (FilePhysEnc) geschrieben wird.
Die Funktion EncodePGP ruft danach die Funktion ReadTextFile auf, die den verschlüsselten Inhalt der zweiten Datei (FilePhysEnc) ausliest. Danach werden beide temporären Dateien mittels der Funktion PGPWipeFile wieder von der Festplatte gelöscht. Die Funktion PGPWipeFile bedient sich dabei der WipeFile Methode des NSDPGP Objektes, um eine Datei unwiederbringlich von der Festplatte zu löschen.
Das Ergebnis der Verschlüsselung sieht dann ähnlich wie in Bild 2 aus.
Bild 2: Ausgabe des verschlüsselten Textes
Schwierigkeiten können bei Benutzung des FileSystemObject Objektes auftreten, da zum Schreiben von Dateien aus ASP die Schreibberechtigung für den Benutzer IUSR_MachineName, in dessem Kontext ASP Seiten ausgeführt werden, gesetzt sein muß. Eine ausführliche Diskussion dieser Thematik finden Sie im AspHeute Artikel Schreiben einer Textdatei auf den Server.
Auf die selbe Art und Weise wie das Verschlüsseln funktioniert auch das Entschlüsseln.
Das Skript decodepgp.asp demonstriert, wie dies mittels ASP funktioniert. Hier ein Auszug aus diesem Skript:
<% @LANGUAGE="VBscript" %> <% Function DecodePGP(strPGPEncodedText, Passphrase, ByRef strDecodedText) Dim FolderPhys, FileNameSource, FileNameDec Dim FilePhysSource, FilePhysDec Dim bWrite, bRead ' Dateiordner, in dem die Dateien temporaer gespeichert werden: FolderPhys = "C:\Temp\" FileNameDec = GetTempFileName FileNameSource = FileNameDec & ".pgp" FilePhysSource = FolderPhys & FileNameSource FilePhysDec = FolderPhys & FileNameDec ' Datei auf Server schreiben bWrite = WriteTextFile(FilePhysSource, strPGPEncodedText) ' Datei mittels PGP entschluesseln DecodePGPFile FilePhysSource, FilePhysDec, Passphrase ' Entschluesselte Datei lesen bRead = ReadTextFile(FilePhysDec, strDecodedText) ' Aufraeumen, temporaere Dateien loeschen If bWrite Then PGPWipeFile FilePhysSource End If If bRead Then PGPWipeFile FilePhysDec End If DecodePGP = bRead And bWrite End Function ' ---------------------------------------------------- Function DecodePGPFile(FileNameSource, FileNameDec, Passphrase) Dim objPGP ' PGP Objekt instanzieren Set objPGP = CreateObject("NSDPGP") ' Datei mit PGP entschluesseln: ' Syntax: objPGP.DecryptFileEx Signfile, _ ' PGP_Quelldatei, ErgebnisDatei, Paßwort objPGP.DecryptFileEx "NOSIGN", _ FileNameSource , FileNameDec, Passphrase Set objPGP = Nothing End Function ' ---------------------------------------------------- ... ' ---------------------------------------------------- ' Hauptprogramm: ' ---------------------------------------------------- Dim Passphrase, strPGP Dim strPassphrase, strText, strPGPText ' Hier default PGP Nachricht einfuegen: strPGP = _ "-----BEGIN PGP MESSAGE-----" & vbcrlf & _ ... "-----END PGP MESSAGE-----" & vbcrlf If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then isPostBack = True strPGPText = Trim(Request.Form("PGPText")) strPassphrase = Trim(Request.Form("Passphrase")) Else isPostBack = False strPGPText = strPGP strPassphrase = "Pass" End If If isPostBack = False then ' Formular ausgeben: %> <form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" method="POST"> Passphrase: <input type="Text" name="Passphrase" value="<%= strPassphrase %>"> <br> <textarea name="PGPText" cols="70" rows="20" wrap="VIRTUAL"> <%= strPGPText %></textarea><br> <input type="Submit" name="Submit" value="Submit"> </form> <% Else ' Text entschluesseln und darstellen bEncrypted = DecodePGP (strPGPText, strPassphrase, strDecText) If bEncrypted Then Response.Write("<b>Der entschlüsselte Text lautet:</b>" & _ "<BR><br>") Response.Write("<pre>" & strDecText & "</pre>") Else Response.Write("Es ist ein Fehler aufgetreten, " & _ "der Text konnte nicht entschlüsselt werden!<BR>") End If Response.Write("<BR>") Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _ """>Zurück</a>") End If %>
Das Skript präsentiert ein Formular, in das der Benutzer die PGP verschlüsselte Nachricht und die Passphrase zum Entschlüsseln eingibt (siehe Bild 3).
Bild 3: Formular zum Entschlüsseln
Die Formularwerte werden von ASP ausgelesen und der verschlüsselte Text in der Funktion namens DecodePGP entschlüsselt. Dazu verwendet die Funktion DecodePGP, die wiederum die Funktion DecodePGPFile aufruft. In der Funktion DecodePGPFile wird der verschlüsselte Text in eine Datei geschrieben und danach diese Datei mittels der DecryptFileEx Methode der NSDPGP Komponente entschlüsselt. Da NSDPGP den entschlüsselten Text wieder in einer Datei auf der Festplatte speichert, liest das ASP Skript den Inhalt dieser Datei aus, bevor es schließlich beide temporäre Dateien mittels WipeFile Funktion der NSDPGP Komponente löscht.
Der entschlüsselte Text wird schließlich wieder im Browser ausgegeben, siehe auch Bild 4.
Bild 4: Ausgabe des entschlüsselten Textes
Die Funktionen, die zum Schreiben und Lesen der Dateien zuständig sind können Sie im vollen Sourcecode lesen, der im Download zu diesem Artikel enthalten ist.
Das Entschlüsseln von beliebigen PGP-verschlüsselten Texten ist unter ASP möglich. Die einzig mir bekannte Komponente, die ein COM-Interface zum Ver- und Entschlüsseln mittels PGP zur Verfügung stellt, ist die NSDPGP Komponente.
Die Einschränkungen der NSDPGP Komponente kann man elegant umgehen, indem man das FileSystemObject Objekt benutzt, das in den Skriptsprachen VBScript und JScript, und damit auch unter ASP zur Verfüfung steht.
Um die PGP Funktionalität am Webserver einzurichten, muß man PGP Version 6.5.1 oder höher, sowie die Komponente NSDPGP installieren.
Natürlich müssen zum Verschlüsseln die dazu nötigen "Public Keys" in PGP vorhanden sein. Zum Entschlüsseln benötigt man darüber hinaus noch den "Private Key" und das Paßwort in Form der sogenannten Passphrase.
Will man das PGP Ver- und Entschlüsseln wie in diesem Artikel beschrieben einsetzen, so gilt es zu bedenken, daß das Schreiben und Lesen von Dateien nicht nur relativ langsam funktioniert, sondern auch die Schreib- und Leseberechtigung für den IUSR_MachineName Account für die Verzeichnisse gesetzt sein muß, in die ein ASP Skript Dateien schreibt bzw. Dateien liest.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000921.zip
Aber bitte mit Rijndael
http:/www.aspheute.com/artikel/20010528.htm
CAPICOM One
http:/www.aspheute.com/artikel/20020115.htm
Passwörter mit SHA1 absichern
http:/www.aspheute.com/artikel/20010330.htm
Passwörter speichern - aber richtig!
http:/www.aspheute.com/artikel/20040105.htm
PGP-Verschlüsselung bei Dateien
http:/www.aspheute.com/artikel/20000920.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Unknackbare Verschlüsselung mit Onetime Pads
http:/www.aspheute.com/artikel/20010924.htm
NSDPGP Komponente
http://community.wow.net/grt/nsdpgp.html
PGP
http://www.pgpi.org/products/pgp/versions/freeware
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.