似乎keychain文件(扩展名为.keychain
)通常会有一个与之关联的不可见文件,位于同一目录中。
这个不可见的文件总是具有以下属性:
0444
(对所有用户都是只读的)。其名称由.fl
后跟8个十六进制字符组成。例如:
.fl043D1EDD
.fl947E1BDB
.fl9FAF0136
.fl12663120
.fl8E6EFC6C
.flCF600F4B
.fl1D8ECE61
.fl0D1D1BA9
.fl79E88CD1
.fl62323D2F
.fl75262C83
.fl652F188E
可以删除不可见的文件,但是当下次修改了钥匙串的内容时,将使用相同的名称重新创建不可见的文件。
以下是使用Keychain Access实用程序演示的一些步骤:
使用终端中的Apple security
工具操作钥匙串时会创建相同的不可见文件:
创建一个新的钥匙串。还会创建一个不可见的文件。
$ cd ~/Desktop/
$ ls -1a
.
..
$ /usr/bin/security create-keychain ~/Desktop/Test.keychain
$ ls -1a
.
..
.fl1BCE4B9A
Test.keychain
删除不可见的文件。
$ rm .fl1BCE4B9A
$ ls -1a
.
..
Test.keychain
修改钥匙串的内容(例如:添加互联网密码)。使用相同的名称重新创建不可见文件。
$ /usr/bin/security add-internet-password -a account -s google.com -w password ~/Desktop/Test.keychain
$ ls -1a
.
..
.fl1BCE4B9A
Test.keychain
删除钥匙串。隐藏文件也会被删除。
$ /usr/bin/security delete-keychain ~/Desktop/Test.keychain
$ ls -1a
.
..
fl
在文件名中的含义是什么?答案 0 :(得分:8)
经过大量调查后,我设法回答了我的大部分问题:
.fl
是安全框架中AtomicFile
类创建的锁文件的文件名前缀。Test.keychain
,则其文件名的SHA-1哈希值以1BCE4B9A...
开头,因此锁定文件将被称为.fl1BCE4B9A
。以下是我调查的详细信息:
我注意到隐身文件不受到钥匙串的locked / unlocked状态的影响。如果删除了不可见文件,则锁定/解锁钥匙串会使不重新创建不可见文件。
我使用Apple的Instruments工具中的文件活动模板进行了一些调查。
这些系统调用负责操作不可见文件:
Security::AtomicFile::create(unsigned short)
Security::RefPointer<Security::AtomicLockedFile>::release_internal()
Security::AtomicFile::write()
Security::RefPointer<Security::AtomicLockedFile>::release_internal()
Security::AtomicFile::performDelete()
这些是相关的文件和类(Apple Open Source的OS X 10.9.2提供的源代码):
AtomicFile.cpp
Security::AtomicFile
Security::AtomicLockedFile
Security::AtomicTempFile
Security::LocalFileLocker
AppleDatabase.cpp
Security::AppleDatabase
Security::DbModifier
这些文件中的评论提供了一些线索:
AtomicFile::AtomicFile()
AtomicFile::create()
LocalFileLocker::lock()
DbModifier::modifyDatabase()
AtomicFile::write()
AtomicFile::performDelete()
我在AtomicFile
构造函数中找到了这段代码:
char buffer[256];
sprintf(buffer, "%08X", hash);
mLockFilePath = mDir + ".fl" + buffer;
其中hash
是钥匙串文件名的SHA-1哈希的前4个字节。
注意:只使用散列的4个字节(32位),reasonable chance of a hash collision为flock()
,LocalFileLocker::lock()
中的注释中提到了这一点。
{{3}}系统调用用于操纵锁定文件的锁定。
以下是锁定钥匙串数据库时的调用树:
DbModifier::createDatabase() or ::modifyDatabase() or ::deleteDatabase()
AtomicFile::create() or ::write() or ::performDelete()
AtomicLockedFile::lock()
LocalFileLocker::lock()
flock(mLockFile, LOCK_EX) // exclusive lock
在写完后解锁时:
DbModifier::commit()
AtomicTempFile::commit()
RefPointer<AtomicLockedFile>::setPointer(AtomicLockedFile*)
RefPointer<AtomicLockedFile>::release_internal()
AtomicLockedFile::~AtomicLockedFile() // destructor
AtomicLockedFile::unlock()
LocalFileLocker::unlock()
flock(mLockFile, LOCK_UN) // unlock