有没有一种快速简便的方法来转储 MacOS X 钥匙串的内容?

Posted

技术标签:

【中文标题】有没有一种快速简便的方法来转储 MacOS X 钥匙串的内容?【英文标题】:Is there a quick and easy way to dump the contents of a MacOS X keychain? 【发布时间】:2010-10-17 13:19:52 【问题描述】:

我正在寻找一种将 OS X 钥匙串的内容转储(导出)到我可以在其他地方轻松处理的文件的方法,例如制表符分隔的纯文本或类似的东西。

Keychain Access 应用程序不提供任何此类功能,获取密钥数据需要依次打开每个数据,并且每次都必须输入密钥链的密码才能查看与密钥一起存储的密码。

经过一番挖掘,我找到了使用 AppleScript 和 Keychain Scripting 应用程序访问钥匙串的解决方案(无法链接到单个帖子;向下滚动大约三分之二到页面末尾):

http://discussions.apple.com/thread.jspa?threadID=1398759

使用钥匙串脚本,您可以访问所有钥匙的所有数据字段——包括明文密码! – 并且将这些数据转储到文本文件等中相当容易。我已经对其进行了测试,并且效果很好。

但是,此解决方案仍然需要通过单击对话框上的“确定”来确认对每个键的访问。这比每次都必须输入钥匙串的密码要好得多,但它仍然很烦人。此外,您必须为每个密钥确认两次访问;一次用于脚本编辑器(或脚本本身,如果它作为应用程序运行),一次用于钥匙串脚本。因此,如果您正在处理具有 100 个键的钥匙串,则必须在 200 个对话框上手动单击“确定”。

我现在正在寻找解决此问题的解决方案。我意识到,由于钥匙链的目的是保护敏感数据并准确防止我正在尝试做的事情,因此任何此类解决方案都可能涉及某种黑客攻击。

我会对你的想法很感兴趣!

【问题讨论】:

【参考方案1】:

好吧,我很愚蠢。有一个名为 security 的命令行工具可以执行此操作(以及钥匙链上的许多其他操作)。

示例用法:

security dump-keychain -d login.keychain

这会将 login.keychain(用户的默认钥匙串)中的所有数据转储为纯文本,包括密码。您仍然必须确认访问,但每个键只需要一次,而且它比使用 AppleScript 快得多(并且在尝试访问某些字段时不会抛出奇怪的错误)。这不是黑客攻击。

如果没有-d 选项,它将转储除密码以外的所有字段。

密钥的转储数据如下所示(对于互联网密钥;程序密钥和证书有其他字段,但格式相同):

keychain: "/Users/<username>/Library/Keychains/login.keychain"
class: "inet"
attributes:
    0x00000007 <blob>="tech.slashdot.org (<username for this web login>)"
    0x00000008 <blob>=<NULL>
    "acct"<blob>="<username for this web login>"
    "atyp"<blob>="form"
    "cdat"<timedate>=0x32303038303432333038323730355A00  "20080423082705Z\000"
    "crtr"<uint32>=<NULL>
    "cusi"<sint32>=<NULL>
    "desc"<blob>="Kennwort des Web-Formulars"
    "icmt"<blob>="default"
    "invi"<sint32>=<NULL>
    "mdat"<timedate>=0x32303038303432333038323730355A00  "20080423082705Z\000"
    "nega"<sint32>=<NULL>
    "path"<blob>=<NULL>
    "port"<uint32>=0x00000000 
    "prot"<blob>=<NULL>
    "ptcl"<uint32>="http"
    "scrp"<sint32>=<NULL>
    "sdmn"<blob>=<NULL>
    "srvr"<blob>="tech.slashdot.org"
    "type"<uint32>=<NULL>
data:
"<the plaintext password for this key>"

【讨论】:

有什么神奇的方法可以避免为每个条目点击一次“始终允许”吗? @Cliff 您可以在此处找到将为您按下按钮的 AppleScript:apple.stackexchange.com/a/137336。 对于 (10.9.5) security 工具看不到的 iCloud 钥匙串,您可以将 iCloud 钥匙串中的所有内容复制到新的钥匙串中,并且仍然使用此技术。 (selfsuperinit.com/2014/01/20/…)【参考方案2】:

请阅读: https://gist.github.com/rmondello/b933231b1fcc83a7db0b

忽略:-----

我在每个键中找到了“始终允许”对话框的解决方案!

只需使用 sudo 运行上一个命令。

sudo security dump-keychain -d login.keychain

这样您只需输入两次密码。一个在终端上用于 sudo,另一个用于解锁钥匙串! ;)

祝你有美好的一天!

【讨论】:

似乎不起作用,它仍然要求我“允许/拒绝”每个项目。也许您在第一次运行命令时“总是允许”所有内容?第二次它似乎神奇地起作用了(不管 sudo 是什么)。 我刚刚按了允许 250 次。 在 High Sierra 中,使用 sudo 运行时仍会提示输入每个键的密码。从 iCloud 复制到本地钥匙串也需要每个钥匙的密码。【参考方案3】:

更新,现在有一个工具可以很好地做到这一点:

Keychaindump 是一个概念验证工具,用于以 root 身份读取 OS X 钥匙串密码。它在安全进程的内存空间中寻找未锁定的钥匙串主密钥,并使用它们来解密钥匙串文件。

来源:https://github.com/juuso/keychaindump

【讨论】:

这个 git 项目是放弃软件,最后一次提交是 6 年前。使用风险自负。【参考方案4】:

其实我只是在寻找相同的: 有人发布了来自github的修改后的applescript。要在 ScriptEditor 中运行,并且必须在 Preferences & Security 中允许。

set keychainPassword to "yourpasswordgoeshere"

tell application "System Events"
    repeat while exists (processes where name is "SecurityAgent")
        tell process "SecurityAgent"
            delay 0.1
            try
                set value of text field 1 of window 1 to keychainPassword
                click button "Allow" of window 1
            end try
        end tell
    end repeat
end tell

您必须分别单击每个窗口才能激活它们。为此,我使用了多年前从 runescape 知道的工具“murgaa auto clicker”(http://www.murgaa.com/auto-clicker-mac/ 似乎仍然有效)。您只需设置自动单击的快捷方式(例如,Command+R)并将计时器设置为 10 毫秒,它就像魅力一样工作。

【讨论】:

【参考方案5】:

我找到了不多次点击“允许”的解决方案

sudo su
security dump-keychain -d /Users/YourUsername/Library/Keychains/login.keychain

【讨论】:

以上是关于有没有一种快速简便的方法来转储 MacOS X 钥匙串的内容?的主要内容,如果未能解决你的问题,请参考以下文章

在Struts2 Action中快速简便的访问RequestSession等变量

OS X 上是不是有 coredump_filter 用于核心转储

计算字符串的干草堆大小

有没有一种快速的方法将点投影到某个网格上?

从方法中检索调用方法名称[重复]

macOS Big Sur 中的分段错误后未生成核心转储文件