简单的1password cli通过查询本地sqlite数据库列出和解密机密

onepassword-local-search的Python项目详细描述


1密码本地搜索

Build Statuscodecov

This is an unofficial tool focused on listing and decryption of secrets with increased performance comparing to native op CLI

如何使用?

此工具不替换1password的官方cliop。您仍然需要它来执行登录和获取会话密钥。

因此,请确保您已在您的环境中注册了操作会话团队。

####数据库路径

脚本将根据您的平台尝试在标准路径搜索数据库。如果失败了或者你想 要使用另一个数据库,可以将env变量onepassword_local_database_path设置为 您要使用的b5.sqlite数据库。

获取解密值

op-local get uuid [field] [--use-custom-uuid] [--use-lastpass-uuid]

总计

如果创建了一个字段类型为“一次性密码”的无标题“一次性密码”,则可以检索 使用特殊字段totp的totp值。例如:op-local get uuid totp

列表项

op-local list [--format='{uuid} {title}'] [--filter=''] [--output-encoding=json]

格式字符串允许您自定义列表项的输出格式。你可以使用任何字段, 将使用任何节中的第一个匹配项。

op-local list --format='{uuid}|{title}|{username}|{password}'

筛选器将只返回其标题包含筛选器字符串的条目。

通过附加,--output-encoding=json,您可以生成正确的json编码列表。例如:

op-local list --format='{{"uuid": "{uuid}", "title": "{title}"}},' --output-encoding=json

通过认证

op-local is-authenticated

检查1密码会话是否已打开。

uuid映射

将项目从一个保管库移动到另一个保管库时,1password中的uuid会发生更改。为了防止这个问题,自定义uuid 已实现映射功能。

您需要在每个项上添加一个名为UUID的字段。

然后运行op-local mapping update生成映射talbe关系。

现在可以使用自己的UUID获得一个项,方法是将--use-custom-uuid标志附加到get命令。

--use-lastpass-uuid标记也做了同样的事情,但是使用了一个LASTPASS_ID字段。

您可以通过运行op-local mapping list来显示uuid映射。

由于0.16和as、uuid v4、lastpass id和1password uuid完全不同,因此将执行搜索 对于给定的uuid类型,不必使用任何特殊标志。

多个账户

此项目支持多帐户解密。但是,请记住您需要:

  • 使用1密码桌面客户端的主帐户进行身份验证
  • 要与您要使用的其他帐户进行身份验证

已知限制

  • 目前,E类保险库(家庭共享?)不支持。我现在不需要这种保险库。我不确定我会在这方面下功夫。
  • 未与您共享的保管库不会被排除,并且将使列表过程失败。我想这是一个简单的修复,将在下一个版本。
  • 未实现组权限。用户必须手动附加到每个保险库。

为什么要做这个项目?

我们使用ansible来管理基础设施,并使用一个查找插件来获取数百个机密。 我们以前使用lastpass,但由于不可靠的api调用和不支持的cli,我们决定离开。 本机op工具的第一个基准测试在大约3到4个小时内显示出了非常差的性能 找回一个秘密。当cli工具请求1password服务器检索机密时,性能 直接受您与服务器的距离的影响。

基准

获取命令

官方操作命令1M23S

Performance may depends on how far you are of a 1Password data-center. I live in South of France, nearest is Frankfurt.

ime (for i in {1..20}; do IDS=('zzfmhu2j7ajq55mmpm3ihs3oqy' 'n3iopimevz3pddels3dgfwyp2a' ); eval "time op get item ${IDS[$((RANDOM % ${#IDS[@]}+1))]} --session="XXX"  > /dev/null"; done)
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,50s user 2,09s system 85% cpu 4,180 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,49s user 2,12s system 84% cpu 4,280 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,12s system 85% cpu 4,230 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,49s user 2,06s system 84% cpu 4,210 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,49s user 2,08s system 88% cpu 4,029 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,11s system 85% cpu 4,222 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,10s system 85% cpu 4,189 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,50s user 2,14s system 93% cpu 3,888 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,49s user 2,12s system 78% cpu 4,601 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,51s user 2,14s system 87% cpu 4,182 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,51s user 2,12s system 92% cpu 3,913 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,49s user 2,11s system 80% cpu 4,494 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,50s user 2,12s system 91% cpu 3,972 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,50s user 2,15s system 93% cpu 3,893 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,12s system 80% cpu 4,487 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,49s user 2,10s system 81% cpu 4,378 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,47s user 2,05s system 90% cpu 3,909 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,07s system 92% cpu 3,859 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy  > /dev/null  1,50s user 2,12s system 93% cpu 3,861 total
op get item n3iopimevz3pddels3dgfwyp2a  > /dev/null  1,50s user 2,09s system 84% cpu 4,240 total
( for i in {1..20}; do; IDS=('zzfmhu2j7ajq55mmpm3ihs3oqy' ) ; eval ; done; )  29,92s user 42,15s system 86% cpu 1:23,02 total

本地操作3,5秒(比原来快23倍)

 time (for i in {1..20}; do IDS=('gzikfbpysjwsqdagcgxcwqmmxe' 'jfcpk2cpgxarvrhlatca7tsyui' 'osk6bqktonuxjm4qgqxs2tpz6a' 'dytzaelqvqrmhfstscb67geuly' ) FIELDS=('password' 'title'); eval "time op-local get ${IDS[$((RANDOM % ${#IDS[@]}+1))]} ${FIELDS[$((RANDOM % ${#FIELDS[@]}+1))]} > /dev/null"; done)
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null  0,13s user 0,03s system 97% cpu 0,165 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe password > /dev/null  0,14s user 0,04s system 98% cpu 0,175 total
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null  0,14s user 0,03s system 98% cpu 0,176 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null  0,13s user 0,03s system 98% cpu 0,170 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null  0,14s user 0,04s system 98% cpu 0,175 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null  0,14s user 0,04s system 98% cpu 0,178 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null  0,13s user 0,03s system 98% cpu 0,168 total
op-local get jfcpk2cpgxarvrhlatca7tsyui title > /dev/null  0,13s user 0,03s system 98% cpu 0,169 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null  0,13s user 0,03s system 97% cpu 0,171 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null  0,13s user 0,04s system 98% cpu 0,173 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null  0,14s user 0,04s system 98% cpu 0,173 total
op-local get jfcpk2cpgxarvrhlatca7tsyui title > /dev/null  0,14s user 0,03s system 97% cpu 0,176 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe password > /dev/null  0,13s user 0,03s system 97% cpu 0,171 total
op-local get dytzaelqvqrmhfstscb67geuly password > /dev/null  0,14s user 0,03s system 97% cpu 0,174 total
op-local get jfcpk2cpgxarvrhlatca7tsyui password > /dev/null  0,14s user 0,04s system 98% cpu 0,179 total
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null  0,14s user 0,04s system 97% cpu 0,181 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null  0,14s user 0,04s system 97% cpu 0,179 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null  0,14s user 0,04s system 98% cpu 0,178 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null  0,14s user 0,04s system 98% cpu 0,182 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null  0,15s user 0,04s system 97% cpu 0,188 total
( for i in {1..20}; do; IDS=('gzikfbpysjwsqdagcgxcwqmmxe'   ) FIELDS=( 'title)  2,74s user 0,71s system 98% cpu 3,509 total

列表命令

0,7s列出并解密1877个条目

time op-local list | wc -l
    1877
op-local list  0,68s user 0,05s system 99% cpu 0,741 total
wc -l  0,00s user 0,00s system 0% cpu 0,740 total

开发

开发需求列在requirements/dev.txt中

mkvirtualenv3 op-local-search
workon op-local-search
pip3 install -r requirements/dev.txt

测试

测试通过pytest完成。

致谢

如果没有david schuetz的工作,awesome这个工具是不可能实现的。(@dschuetz)https://github.com/dschuetz/1password

我还要感谢1password的支持团队,特别是@cohix,它帮助了我 低调找到1密码的其余内部。

非常感谢jo_l franusic和他在jwkhttps://github.com/jpf/okta-jwks-to-pem上的工作。那帮助我 大大提高了应用程序的性能。

非常感谢大家!

许可证

gplv3

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javai是JAXB的新手。如何将两个具有不同名称空间的不同xml合并为一个具有根元素的xml并将其解组?   JDO中的java应该是可传递的DefaultFetchGroup吗   java服务器配置问题   java在理解JList时遇到困难   java何时将RequestContextFilter用于Jersey?   java从数据库中读取文本文件。jar文件   Java正则表达式,仅适用于不包括零的正数   爪哇番石榴。类路径中的jar   JavaEE:关于设计的问题   java GUI,在面板中排列按钮   java Android为什么使用接口被认为是活动和片段之间通信的最佳实践?   java如何获取wicket图像的url以在开放图元标记中使用它   从Java字节[]>Base64>Javascript数组缓冲>Base64>byte[]   java正则表达式帮助字符串JWE766。1.pdf格式摘录766   java Hibernate,JPA忽略@Formula