Es scheint, dass eine Schlüsselbund Datei (mit der Erweiterung .keychain
) normalerweise eine unsichtbare Datei hat damit verbunden, im selben Verzeichnis befindet.
Diese unsichtbare Datei hat immer diese Eigenschaften:
0444
(schreibgeschützt für alle Benutzer). Der Name besteht aus .fl
gefolgt von 8 Hex-Zeichen. Zum Beispiel:
Die unsichtbare Datei kann gelöscht werden, aber wenn der Inhalt des Schlüsselbunds als nächstes geändert wird, wird die unsichtbare Datei mit dem gleichen Namen neu erstellt.
Hier sind einige Schritte, die Sie mit dem Keychain Access -Dienstprogramm demonstrieren können:
Ich habe überprüft, dass dies in OS X 10.8 und 10.9 .
Dieselben unsichtbaren Dateien werden erstellt, wenn Schlüsselbunde mit Apples Werkzeug security
im Terminal manipuliert werden:
Erstellen Sie einen neuen Schlüsselbund. Eine unsichtbare Datei wird ebenfalls erstellt.
%Vor%Löschen Sie die unsichtbare Datei.
%Vor%Ändern Sie den Inhalt des Schlüsselbundes (z. B. durch Hinzufügen eines Internet-Passworts). Die unsichtbare Datei wird mit demselben Namen neu erstellt.
%Vor%Löschen Sie den Schlüsselbund. Die unsichtbare Datei wird ebenfalls gelöscht.
%Vor%fl
im Dateinamen? Nach vielen Nachforschungen habe ich die meisten meiner Fragen beantwortet:
.fl
ist das Dateinamenspräfix für Sperrdateien, die von der Klasse AtomicFile
im Sicherheitsframework erstellt wurden. Test.keychain
heißt, beginnt der SHA-1-Hash seines Dateinamens mit 1BCE4B9A...
und die Sperrdatei heißt daher .fl1BCE4B9A
. Hier sind die Details meiner Untersuchung:
Ich habe festgestellt, dass die unsichtbare Datei nicht von gesperrt / unlocked Status. Wenn die unsichtbare Datei gelöscht wurde, macht das Sperren / Entsperren des Schlüsselbunds die nicht sichtbare Datei nicht neu.
Ich habe einige Nachforschungen angestellt, indem ich die File Activity-Vorlage in Apples Instruments
Diese Systemaufrufe sind verantwortlich für die Manipulation der unsichtbaren Datei:
Security::AtomicFile::create(unsigned short)
Security::RefPointer<Security::AtomicLockedFile>::release_internal()
Security::AtomicFile::write()
Security::RefPointer<Security::AtomicLockedFile>::release_internal()
Security::AtomicFile::performDelete()
Dies sind die relevanten Dateien und Klassen (Quellcode aus Apple Open Source für OS X 10.9.2 ):
AtomicFile.cpp
Security::AtomicFile
Security::AtomicLockedFile
Security::AtomicTempFile
Security::LocalFileLocker
AppleDatabase.cpp
Security::AppleDatabase
Security::DbModifier
Die Kommentare in diesen Dateien haben einige Hinweise geliefert:
Ich habe diesen Code im AtomicFile::AtomicFile()
-Konstruktor gefunden:
Dabei steht AtomicFile::create()
für die ersten 4 Byte des SHA-1 Hash des Dateinamens des Schlüsselbuchs.
Hinweis: Wenn nur 4 Bytes (32 Bits) des Hashs verwendet werden, gibt es ein vernünftige Chance einer Hash-Kollision , die im Kommentar in LocalFileLocker::lock()
erwähnt wird.
Der DbModifier::modifyDatabase()
Systemaufruf ist verwendet, um die Sperre für die Sperrdatei zu manipulieren.
Hier ist der Aufrufbaum, wenn die Datenbank des Schlüsselbunds zum Schreiben gesperrt ist:
%Vor%und wenn es nach dem Schreiben entsperrt wird:
%Vor%Tags und Links macos keychain locking flock security-framework