Tac*_*tex 10 macos locking keychain security-framework flock
似乎钥匙串文件(带扩展名.keychain
)通常会有一个与之关联的不可见文件,位于同一目录中.
这个不可见的文件总是具有以下属性:
0444
(对所有用户都是只读的).它的名称.fl
后跟8个十六进制字符.例如:
.fl043D1EDD
.fl947E1BDB
.fl9FAF0136
.fl12663120
.fl8E6EFC6C
.flCF600F4B
.fl1D8ECE61
.fl0D1D1BA9
.fl79E88CD1
.fl62323D2F
.fl75262C83
.fl652F188E
Run Code Online (Sandbox Code Playgroud)可以删除不可见的文件,但是当下次修改钥匙串的内容时,将使用相同的名称重新创建不可见的文件.
以下是使用Keychain Access实用程序演示的一些步骤:
使用security
终端中的Apple 工具操作钥匙串时会创建相同的不可见文件:
创建一个新的钥匙串.还会创建一个不可见的文件.
$ cd ~/Desktop/
$ ls -1a
.
..
$ /usr/bin/security create-keychain ~/Desktop/Test.keychain
$ ls -1a
.
..
.fl1BCE4B9A
Test.keychain
Run Code Online (Sandbox Code Playgroud)删除不可见的文件.
$ rm .fl1BCE4B9A
$ ls -1a
.
..
Test.keychain
Run Code Online (Sandbox Code Playgroud)修改钥匙串的内容(例如:通过添加互联网密码).使用相同的名称重新创建不可见文件.
$ /usr/bin/security add-internet-password -a account -s google.com -w password ~/Desktop/Test.keychain
$ ls -1a
.
..
.fl1BCE4B9A
Test.keychain
Run Code Online (Sandbox Code Playgroud)删除钥匙串.隐藏文件也会被删除.
$ /usr/bin/security delete-keychain ~/Desktop/Test.keychain
$ ls -1a
.
..
Run Code Online (Sandbox Code Playgroud)fl
文件名中的含义是什么?经过大量的调查,我设法回答了我的大部分问题:
.fl
是AtomicFile
安全框架中的类创建的锁文件的文件名前缀.Test.keychain
,则其文件名的SHA-1哈希开头,1BCE4B9A...
因此将调用锁定文件.fl1BCE4B9A
.以下是我调查的详细信息:
我注意到,看不见的文件不会受到钥匙扣的锁定/解锁状态.如果看不到文件已被删除,然后锁定/解锁钥匙串并没有重新无形的文件.
我使用Apple的Instruments工具中的File Activity模板进行了一些调查.
这些系统调用负责操作不可见文件:
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 for 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;
Run Code Online (Sandbox Code Playgroud)
其中hash
是keychain文件名的SHA-1哈希的前4个字节.
注意:只使用散列的4个字节(32位),有一个合理的机会发生哈希冲突,这在评论中提到LocalFileLocker::lock()
.
该flock()
系统调用用于操作上的锁文件锁.
当钥匙串的数据库被锁定以进行写入时,这是调用树:
DbModifier::createDatabase() or ::modifyDatabase() or ::deleteDatabase()
AtomicFile::create() or ::write() or ::performDelete()
AtomicLockedFile::lock()
LocalFileLocker::lock()
flock(mLockFile, LOCK_EX) // exclusive lock
Run Code Online (Sandbox Code Playgroud)
当它写完后解锁时:
DbModifier::commit()
AtomicTempFile::commit()
RefPointer<AtomicLockedFile>::setPointer(AtomicLockedFile*)
RefPointer<AtomicLockedFile>::release_internal()
AtomicLockedFile::~AtomicLockedFile() // destructor
AtomicLockedFile::unlock()
LocalFileLocker::unlock()
flock(mLockFile, LOCK_UN) // unlock
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1314 次 |
最近记录: |