- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下简短的 Python 脚本采用三个命令行参数:密码、输入路径和输出路径。然后使用密码解密输入路径的内容,并将解密后的内容放入输出路径。
from gpg import Context
import sys
pp = sys.argv[1] # passphrase
enc = sys.argv[2] # input file (assumed to be encrypted)
dec = sys.argv[3] # output file
with open(enc, 'rb') as reader, open(dec, 'wb') as writer, Context() as ctx:
try:
ctx.decrypt(reader, sink=writer, passphrase=pp)
except Exception as e:
print(str(e), file=sys.stderr)
只要提供正确的密码短语,此解密就可以正常工作,但显然会导致缓存此类正确的密码短语,因此无论提供的密码短语如何,任何后续解密尝试都会成功。 (我在本文末尾更完整地说明了我的意思,以及版本详细信息。)
显然,正在进行一些密码缓存,但我不太了解细节。
我想知道的是:如何修改 Python 脚本以使其禁用密码缓存?请注意,我对如何在脚本外禁用密码缓存不感兴趣!我希望脚本自动禁用密码缓存。这可能吗?
下面是我上面提到的内容的详细示例。脚本 ./demo.py
就是我在上面列出的来源。重要提示:下面给出的代码仅在我从命令行执行时才表现得如此。如果我将它放在一个文件中并将其作为脚本执行(或获取),那么所有使用错误密码的解密都会失败,无论之前使用正确密码进行的任何成功解密都是如此。
# Prologue: preparation
# First, define some variables
% ORIGINAL=/tmp/original.txt
% ENCRYPTED=/tmp/encrypted.gpg
% DECRYPTED=/tmp/decrypted.txt
% PASSPHRASE=yowzayowzayowza
# Next, create a cleartext original:
% echo 'Cool story, bro!' > "$ORIGINAL"
# Next, encrypt the original using /usr/bin/gpg
% rm -f "$ENCRYPTED"
% /usr/bin/gpg --batch --symmetric --cipher-algo=AES256 --compress-algo=zlib --passphrase="$PASSPHRASE" --output="$ENCRYPTED" "$ORIGINAL"
# Confirm encryption
% od -c "$ENCRYPTED"
0000000 214 \r 004 \t 003 002 304 006 020 % q 353 335 212 361 322
0000020 U 001 w 350 335 K 347 320 260 224 227 025 275 274 033 X
0000040 020 352 002 006 254 331 374 300 221 265 021 376 254 9 $ <
0000060 233 275 361 226 340 177 330 ! c 372 017 & 300 352 $ k
0000100 252 205 244 336 222 N 027 200 | 211 371 r Z ] 353 6
0000120 261 177 b 336 026 023 367 220 354 210 265 002 : r 262 037
0000140 367 L H 262 370
0000146
# Now, the demonstration proper.
# Initially, decryption with the wrong passphrase fails:
% rm -f "$DECRYPTED"
% python ./demo.py "certainly the wrong $PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"
gpgme_op_decrypt_verify: GPGME: Decryption failed
# Decryption with the right passphrase succeeds:
% rm -f "$DECRYPTED"
% python ./demo.py "$PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"
% od -c "$DECRYPTED"
0000000 C o o l s t o r y , b r o !
0000020 \n
0000021
# After the first successful decryption with the right
# passphrase, decryption with the wrong passphrase always
# succeeds:
% rm -f "$DECRYPTED"
% python ./demo.py "certainly the wrong $PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"
% od -c "$DECRYPTED"
0000000 C o o l s t o r y , b r o !
0000020 \n
0000021
# Some relevant version info
% python -c 'import gpg; print((gpg.version.versionstr, gpg.version.gpgme_versionstr))'
('1.10.0', '1.8.0')
% gpg --version
gpg (GnuPG) 2.1.18
libgcrypt 1.7.6-beta
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /home/kj146/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
% python --version
Python 3.5.3
% uname -ar
Linux parakeet 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2 (2017-04-30) x86_64 GNU/Linux
最佳答案
深入挖掘 C gpgme
库(这是您使用的 Python 库正在包装的内容),有:
https://www.gnupg.org/documentation/manuals/gpgme/Context-Flags.html#Context-Flags
"no-symkey-cache"
For OpenPGP disable the passphrase cache used for symmetrical en- and decryption.
This cache is based on the message specific salt value. Requires at least GnuPG
2.2.7 to have an effect.
我不确定上下文如何与文件系统或 GPG 代理交互,但您的第一次尝试应该是将此标志设置为 true。
关于python - 如何防止基于 gpgme 的 Python 脚本中的密码缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55670294/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!