Das cryptofs-Dateisystem ist ein spezielles loopback-Dateisystem, das die verschlüsselte Speicherung beliebiger Daten ermöglicht. Die Möglichkeit unverschlüsselte Daten zu Lesen bzw. zu Schreiben bleibt erhalten.
Um mit dem cryptofs-Dateisystem zu arbeiten, muss ein das Verzeichnis (z.B. /crypt.files), welches die codierten Dateien beinhalten soll, mit dem Kommando
mount -F cryptofs /crypt.files /mntan ein beliebiges Verzeichnis (z.B. /mnt) gemountet werden. Über dieses Verzeichnis ist anschliessend der Zugriff auf die codierten Daten mit dem zugehörigen Schlüssel möglich. Der entsprechend Schlüssel kann über das Kommando
cryptofs_keyset Schlüsselfür die aktuelle shell bzw. alle aus dieser shell heraus gestarteten Programme gesetzt werden.
Die Implementierung setzt sich aus drei Teilaufgaben zusammen: Dateisystem, Schlüsselverwaltung, Crypt-Algorithmus
Das Dateisystem besteht grösstenteils aus einem reinen loopback-Dateisystem, das auf dem Solaris-lofs-Dateisystem aufbaut.
Es enthält zwei grössere Verwaltungskomponenten:
Die Vnode-Liste:
Hier werden alle ausgegebenen Vnodes in einer verzeigerten Liste verwaltet.
Die Schlüssel-Liste:
Diese Liste enthält alle gültigen Schlüssel mit einem Verweis auf den entsprechenden Prozess, der diesen Schlüssel besitzt.
(Weitere Details siehe Schlüsselverwaltung)
Die Dateisystemfunktionen, die von den Crypt-Routinen nicht berührt werden, werden durch die entsprechenden Funktionen des darunterliegenden Dateisystems erbracht.
Die eigentliche Codierung/Decodierung findet in den Routinen crypto_read und crypto_write statt. Hier werden die vom Benutzer übergebenen bzw. angeforderten Daten blockweise in einen Zwischenpuffer gelesen, wobei sich die Grösse dieses Puffer dynamisch an die Anforderungen des Benutzers anpasst (max. Blockgrösse 8 KB).
Um den Anforderungen des verwendeten Crypt-Algorithmus zu genügen, werden Blöcke mit einer Grösse von x * 8 Byte verwendet. Dies kann dazu führen, dass ein Puffer aufgefüllt werden muss, damit er die entsprechende Grösse erreicht. Aus diesem Grund ist es nötig die echte Filelänge innerhalb eines Headers mit dem eigentlichen File zu speichern.
Dieser Header wird ebenfalls dazu verwendet die Korrektheit des übergebenen Schlüssels zu überprüfen. Schlägt die Decodierung des Headers fehl, besitzt der Benutzer nicht das Recht das entsprechende File zu lesen. Der Zugriff wird in diesem Fall verweigert.
Da das cryptofs-Dateisystem auch den Zugriff auf nicht verschlüsselte Daten gewährleisten soll, werden codierte Files mit einer Kennung versehen, die das Dateisystem veranlasst die entsprechenden Crypto-Routinen anzustossen. Ist diese Kennung nicht vorhanden, werden diese Routinen umgangen und das cryptofs-Dateisystem verhält sich wie ein reines loopback-System.
Um dem Benutzer deutlich zu machen, auf welche Files er mit seinem gerade aktiven Schlüssel zugreifen kann, werden die Files, für die sein Schlüssel ungültig ist, in den Zugriffsrechen entsprechen gekennzeichnet.
Wie bereits erwähnt kann sich der Benutzer seinen Schlüssel über das Kommando cryptofs_keyset setzen. Dies führt dazu, das in der entsprechenden Verwaltungsstruktur der Schlüssel an die gerade aktive shell des Benutzers gebunden wird.
Greift ein Programm, das der Benutzer aus dieser shell heraus gestartet hat auf ein gecryptetes File zu, wird über die Verwaltungsstruktur geprüft ob der entsprechende Prozess bzw. einer seiner Vaterprozesse einen Schlüssel besitzt, und verwendet diesen.
Als Verschlüsselungsverfahren wird ein symmetrischer DES-Algorithmus verwendet. Da die vorliegende Implementierung wie oben erwähnt nur auf 8 Byte-Blöcken arbeitet, ist es nötig, halbvolle Blöcke auf 8 Byte-Grenzen aufzufüllen. Unsere Implementierung arbeitet mit alphanumerischen Schlüsseln mit einer Länge von 8 Zeichen. Dies sollte für normale Anwendungen sicher genug sein.