我发现你可以使用安全命令行工具提取数据.安全注释存储为通用密码,具有以下特征:
class: "genp" - 这与通用密码相同
type<uint32>="note" - 您可以使用此功能在搜索时特别识别安全注释(使用-C标志).
desc<blob>="secure note" - 我不知道您可以根据此字段进行搜索,但它肯定会将该项目标识为安全注释
0x00000007 <blob>= "Note name" - 我不知道你是否可以通过API获得这个,但你绝对可以从命令行工具获得它
acct<blob>=<NULL> - 这似乎是安全笔记的共同特征
使用此命令security dump-keychain可查找有关钥匙串项的各种有用信息.
小智 7
您可以使用 macOS 终端中的一长串命令来获取钥匙串安全笔记的值。下面的代码片段获取名为“foobar”的注释的值,并将其保存到用户桌面上名为 foobar.txt 的文件中。
security find-generic-password -C note -s 'foobar' -w | xxd -r -p |
xmllint --xpath "//dict/data/text()" - | base64 --decode |
textutil -stdin -convert txt -output ~/Desktop/foobar.txt
Run Code Online (Sandbox Code Playgroud)
只是为了扩展接受的答案:
实际上,“安全注释”只是作为特殊格式的通用密码存储的。因此,如果您创建安全便笺,则可以使用Keychain Services API:SecKeychainFindGenericPassword()或security命令行工具以编程方式访问它。
作为使用的示例security,如果您有一个名为“测试笔记”的安全笔记:

您将需要搜索“安全注释”和注释的标题“测试注释”。“类型”(或desc字段)将为“注释”,“服务”(或svce字段,为钥匙串条目的名称)将为注释的实际标题。似乎对于您指定的每个字段,它必须是准确的,因此搜索“ Testing *”或“ Testing”将不会为我们的注释显示任何结果。
因此,您可以使用此命令来搜索类型为“安全笔记”且标题为“测试笔记”的笔记:
security find-generic-password -C note -s "Testing Note"
结果是:
keychain: "/Users/USERNAME/Library/Keychains/login.keychain"
class: "genp"
attributes:
0x00000007 <blob>="Testing Note"
0x00000008 <blob>=<NULL>
"acct"<blob>=<NULL>
"cdat"<timedate>=0x32303134313231323137333130395A00 "20141212173109Z\000"
"crtr"<uint32>=<NULL>
"cusi"<sint32>=<NULL>
"desc"<blob>="secure note"
"gena"<blob>=<NULL>
"icmt"<blob>=<NULL>
"invi"<sint32>=<NULL>
"mdat"<timedate>=0x32303134313231323137333130395A00 "20141212173109Z\000"
"nega"<sint32>=<NULL>
"prot"<blob>=<NULL>
"scrp"<sint32>=<NULL>
"svce"<blob>="Testing Note"
"type"<uint32>="note"
Run Code Online (Sandbox Code Playgroud)
要同时输出密码,还需要将该-g选项传递给security命令,除非您已明确设置security为访问该钥匙串项的受信任/允许程序,否则它将询问您是否要允许访问密码。钥匙扣项目:

仅查看密码输出(您可以使用该-w选项仅输出“密码”或便笺的文本,但是不会得到“解码的”输出,而仅得到十六进制),您将得到:
security find-generic-password -C note -s "Testing Note" -w
(为清楚起见而格式化)
3c3f786d 6c207665 7273696f 6e3d2231 2e302220 656e636f
64696e67 3d225554 462d3822 3f3e0a3c 21444f43 54595045
20706c69 73742050 55424c49 4320222d 2f2f4170 706c652f
2f445444 20504c49 53542031 2e302f2f 454e2220 22687474
703a2f2f 7777772e 6170706c 652e636f 6d2f4454 44732f50
726f7065 7274794c 6973742d 312e302e 64746422 3e0a3c70
6c697374 20766572 73696f6e 3d22312e 30223e0a 3c646963
....... (and so on)
Run Code Online (Sandbox Code Playgroud)
不是很有用!如果我们使用一些python代码对其进行解码:(或您选择的任何语言)
#!/usr/bin/env python3
import xml.etree.ElementTree as ET
import plistlib, pprint, binascii
# not full hex string for brevity!
hex_data = '''3c3f786d6c2076657273696f6e3d22312e3022206....'''
# decode hex into bytes
xml_bytes = binascii.unhexlify(hex_data)
# create ElementTree object since its an XML PList
ET.fromstring(xml_bytes)
# print out xml
print(ET.tostring(xml_bytes))
# or you can load it straight into a python object using plistlib
plist_dict = plistlib.loads(xml_bytes)
pprint.pprint(plist_dict)
Run Code Online (Sandbox Code Playgroud)
现在我们到了某个地方!解码的结果是:
<plist version="1.0">
<dict>
<key>NOTE</key>
<string>12345
abcdefghijklmnopqrstuvwxyz
HELLO WORLD
=)
</string>
<key>RTFD</key>
<data>
cnRmZAAAAAADAAAAAgAAAAcAAABUWFQucnRmAQAAAC43AQAAKwAAAAEAAAAvAQAAe1xy
dGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYxMzQzXGNvY29hc3VicnRmMTYwCntc
Zm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQwIEhlbHZldGljYTt9CntcY29sb3J0Ymw7
XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KXHBhcmRcdHg1NjBcdHgxMTIwXHR4MTY4
MFx0eDIyNDBcdHgyODAwXHR4MzM2MFx0eDM5MjBcdHg0NDgwXHR4NTA0MFx0eDU2MDBc
dHg2MTYwXHR4NjcyMFxwYXJkaXJuYXR1cmFsCgpcZjBcZnMyNCBcY2YwIDEyMzQ1XAph
YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwKSEVMTE8gV09STERcCj0pXAp9AQAAACMA
AAABAAAABwAAAFRYVC5ydGYQAAAAXSaLVLYBAAAAAAAAAAAAAA==
</data>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
因此,显然我们将纯文本密码作为密钥“ NOTE”的值(因为这是plists存储字典的方式),但是“ RTFD”密钥是什么?以二进制形式查看它会给人以某种rtfd文件的印象:
b'rtfd\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00TXT.rtf\x01 ......
Run Code Online (Sandbox Code Playgroud)
但是将其保存为.rtfd不起作用,但是后来我意识到从TextEdit中保存的RTFD是捆绑包!因此,它是如何工作的……您无法真正将捆绑包序列化为字节,因为它是一个内部包含文件的文件夹,但是在进行更多搜索后,(我发现了Apple Type Code列表,并且有“ com.apple。 rtfd”,还有“ com.apple.flat-rtfd”,它表示是“粘贴板”格式!
因此,我使用了Apple的示例应用程序,其中显示了有关剪贴板/粘贴板的详细信息。然后,您可以右键单击“钥匙串访问”中的“复制安全说明”:

然后,如果您查看ClipboardViewer中的字节,您会看到它与plist标记中未十六进制的字节匹配。
ew!这比我预期的要长得多。...总之,安全便笺只是带有标题的通用密码,而密码部分是Apple XML Plist,具有纯文本数据和粘贴板中的数据。适用于通过“将安全笔记复制到剪贴板”复制到剪贴板的格式。
我希望这能清除安全注释的存储方式,因为确实缺少访问安全注释的API函数,并且官方钥匙串访问API中没有任何功能。
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |