如何从命令行使用 gpg 加密给定的字符串?我将公钥存储在一个名为 pubkey.pub 的文件中,我想我可以简单地用类似的东西来做到这一点。
gpg --import "path/to/pubkey.pub" --encrypt "my string to encrypt"
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。
背景:我必须使用 PHP exec 命令来加密给定的文本,因为我没有在服务器上安装 PHP 模块本身。
#! /bin/bash
if which gnupg >/dev/null; then
echo "Installed"
else
echo "Not installed" #If not installed
echo "Installing..."
sudo apt-get install gnupg #installation
fi
Run Code Online (Sandbox Code Playgroud)
你有什么主意吗?当我运行它时,它显示尚未安装,但它尝试更新它。结果它说:gnupg 已经是最新版本了。0 已升级,0 已新安装,0 已删除,46 未升级。
我正在经历在 Maven Central 上获取公司工件的(看似复杂的)程序。然后我进入了GPG签名部分,进入了一个充满困惑和难题的新世界。GPG 有如此多的选择,并且尚不清楚签署公司工件的合理做法应该是什么。
假设 Acme 想要将一个工件发布org.example.acme:foobar:1.0.0到 Maven Central。他们应该使用什么用户 ID 来签名?什么子键?该密钥如何与用户的个人密钥分开?
让我一一解答所有疑问,让您了解为什么它令人困惑。
admin@acme.example.com?该身份应该是 Acme 还是 Acme 的一个部门?或者应该只有个人签署工件才能在 Maven 上发布?"Acme (software) software@acme.example.com"?要不就"Acme acme@acme.example.com"。我可以继续说下去……尝试总结一下,所有示例似乎都假设 1) 用户的密钥环上只安装了一个用户 ID,2) 每个签署其工件的人都是个人,而不是公司。
签署组织的 Maven 工件的预期方法是什么?用户如何将组织的密钥与用户的个人密钥分开管理?
我在 Mac 上下载了sourcetree 应用程序,并向其中添加了本地 git 存储库。每当我尝试隐藏某些内容或提交某些内容时,sourcetree 都会抛出与 gpg 相关的错误。错误示例如下。
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree stash save test-stash
/Applications/SourceTree.app/Contents/Resources/bin/gpg: line 2: gpg2: command not found
error: gpg failed to sign the data
Cannot save the current index state
Completed with errors, see above
Run Code Online (Sandbox Code Playgroud)
我无法找出此错误的原因。据我记得,我还没有为任何类型的签名配置项目或 sourcetree 应用程序。
如果您能帮助我解决此问题,那将会有很大帮助。
我正在使用 python-gnupg 包来创建 GPG 公钥和私钥。我将生成的私钥存储在 AWS Secrets Manager 中,如下所示。
Key: private_key
value: -----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
lQO+BF37qDIBCADXq0iJVRYFb43+YU8Ts63hDgZl49ZNdnDVhd9H0JMXRHqtPqt9
bbFePPN47NRe6z6GsbPaPmDqEE9l3KjFnSZB/yCii+2wHZR0ij2g3ATbiAbOoQQy
I6bbUADmHtcfIJByoXVoDk489nUPt84Xyp1lHiBfCtUmq4w62Okq6InlRhxjxcEx
VvSXaCY8YnEXUAgNGpvcKHDejGS9V4djh7r7lgJ/Y+3Xb2eepOfiaCx2Cn8ZMI0q
7eWH0MmSeR4ueOLeb79ZKjpJraBfV91XplgHHiM18oECWWwsQCFiwi1GVOLpX6Fh
HIoUyaRAW2vZyFcNnO7iLbetie6fE884lfHxABEBAAH+AwMCO+Qoh7o3GWVga9f2
gHEeuGGH4KB3aspQZt/zwKpx7YlDB/uLd4q7JQt35nIH6pfYdMwgQt001CRhsGvX
QVKIkvipQvJZgCO8Nix7xYCukH0cI4TXD7S9BmRNMCPi74+Q1J3cDfKHCseynMNF
GzBeCDx6LW3CVfKKs0Mc2ecSl0c8gxaPDi3AfACRMefEAuVQyo82qJKjpI+O/Yik
z40C5OgK0XfetKstxcH4B0bx0o/PrUpYFM/gHHgFkbpVg5citcvFY4VcEkWryVcg
yF0qBPXP0OKBtCUU1ZGiCwRJy8iGd/dOOICcSCfMNy+jzzM3FSVzei69x7MYt3xu
IzCsmHpDvpdL7tiDDHgwajZeFFPTzf7Ic90K6TapQ3H59xPMxnL9K5o9rP1glRY0
8e4zYjYxg9A6Yl3K5zdqs+M1A3Os70HUlWZXZ4LQNcidPd1rhnPnm9eXkyV2ScXl
dE38aOA5pnrL0WZUM3/OLAToMP6h4rjw9WLqqgWlrl6yz9bhZrfRxlhZaEtNs1bi
pgrmPK/a5fK++BjMSuA94EkXTVNjKWNQBzcmrff27M1TMwN+34NWj3dk/a1gyflP
QZgK3MT+0GaMCcvy1EoZ87ffLQrWwFJOw5nT83yG7VBbuerSEk/tk30bxmYN6HzO
zvQgSjDiiH+ANXVupnzDjjBREmH6V1Hv+7Q0vrjKQHd3eYvKJpAWfFr9kO8DzKck
ZkSMj487SjlHbh33z1yupuwAtjyYQ5tN1adSlDa92t0Q08udnFDQtxXEnL6rw/Du
llEuCEVC9UYcNwwQGMsGXQBFFfj1389WHr0hkSOvyS1nPiIku5kNXDhSWq7/okTS
FwnCt+wbZa6TWbXjwKzHzu4LOarV1s8DnYHKNH6HHIqsVR2oJuIuqhyREAqjeP/T
3bQjQXV0b2dlbmVyYXRlZCBLZXkgPG1laHVsQHBoZWFhLm9yZz6JATkEEwECACMF
Al37qDICGy8HCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRDO+i9CZ70SvqMn
CACCmdzqZW68j1E45XTHz3fvqdft6fXOyrlMuDdcH2y7Zrl5JS7PlCeHzIcsSMlH
wDYpCG8km7nwZsnWqKsOXFWq1nq/j7Kv5AzR7UmPzTw/1HFSVhIFA0ZZMHAnwp7Y
bcAT+ssvo4To9CjzRp/ZI1k26RFXPWuXETa41DBIVz13Ss4SIaf7UG9FQ55o+2BA
TP48yCQqktiWOoZ0rV1ALSFlE4Gs3UWHcYxxCABA0JB4+FuCRfB8QMreLwFb47wc
dIitbVl0mQx5IXCkqhJKqR62rRy25Put4xnPhXGtXqfoYDVYvYvlsl/FA35cX+Z1
QODnLq/jQ7ZPdaFC7cFqxztk
=RvGa
-----END PGP PRIVATE KEY BLOCK-----
Key: passphrase
Value: secret123
Run Code Online (Sandbox Code Playgroud)
我想要做的就是从 AWS Secrets Manager 中提取密钥和值对并导入密钥,然后解密文件。
众所周知,JSON 不会解释多行值中的换行符,因此 GPG import_keys 无法导入私钥。如果我只是读取具有相同私钥的本地文件,那么就没问题。请告诉我这个问题是否有任何解决方法?
try:
secretkey = self.get_secret(secretName)
if not secretkey:
self.logger.error("Empty secret key")
exit(0) …Run Code Online (Sandbox Code Playgroud) 我很难为 Emacs 设置pinentry来进行身份验证(比如说 github)。使用 GPG 和 pinentry 来签署提交已经可以了。我在 emacs 中使用 magit 进行版本控制,每次我提交一些内容时,迷你缓冲区中都会弹出 pinentry,我输入密码并对提交进行签名。都好。
不过我也使用 GPG 进行身份验证。我使用 GPG设置和身份验证子密钥,并设置 SSH 来使用它。如果我从 tty 执行此操作,它也会起作用。只是不是从 Emacs 内部。该问题与环境变量有关$GPG_TTY。如果我尝试将某些内容推送到 GH,则迷你缓冲区中的 pinentry 不会弹出。相反,它会等待并最终说我没有权限。
我应该提到我使用 emacs,更具体地说是 EXWM 作为我的窗口管理器。如果我退出 emacs,我会在 TTY 中看到 pinentry-encurses 对话框。如果我在 emacs 中打开另一个终端,同时按下它,它将在该终端中打开 pinentry-ncurses 对话框,而不是在迷你缓冲区中弹出 pinentry.el。
几天来我一直在谷歌搜索并尝试不同的方法,但没有运气。
〜/.gnupg/gpg-agent.conf:
allow-emacs-pinentry
allow-loopback-pinentry
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)
〜/.gnupg/gpg.conf:
use-agent
Run Code Online (Sandbox Code Playgroud)
〜/ .bash_配置文件:
# GPG related
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
export GPG_TTY=$(tty)
#gpgconf --launch gpg-agent
Run Code Online (Sandbox Code Playgroud)
我在 emacs 中的 pinentry 配置:
;; Enable loopback so …Run Code Online (Sandbox Code Playgroud) secret.txt.gpg我有要解密的文件,以便内容存储在如下变量中:
TXT=$(gpg --decrypt secret.txt.gpg)\nRun Code Online (Sandbox Code Playgroud)\n但这样会添加很多额外的gpg: \xe2\x80\xa6行,其中包含有关密钥等的信息,如下所示:
gpg: encrypted with 4096-bit RSA key, ID xxxx, created xxxx\n "xx xx (xx) <xx@xx.xx>"\ngpg: Signature made xxx\ngpg: using RSA key xxx\n\xe2\x80\xa6\nSecret Message\nRun Code Online (Sandbox Code Playgroud)\n顺便一提:
\ngpg -d secret.txt.gpg > out.txt\nRun Code Online (Sandbox Code Playgroud)\n只是将内容写入文件。
\n如何仅捕获内容而不将其写入文件?
\n尽管@Roger的答案更好并解释了原因,但我可以使用以下方法来实现:
\nTXT=$(gpg --decrypt secret.txt.gpg > /dev/stdout)\nRun Code Online (Sandbox Code Playgroud)\n 我有一个 GPG 加密文件的本地 python 代码。一旦将文件添加到触发此 lambda 的 AWS S3,我需要将其转换为 AWS Lambda。
我的本地代码
import os
import os.path
import time
import sys
gpg = gnupg.GPG(gnupghome='/home/ec2-user/.gnupg')
path = '/home/ec2-user/2021/05/28/'
ptfile = sys.argv[1]
with open(path + ptfile, 'rb')as f:
status = gpg.encrypt_file(f, recipients=['user@email.com'], output=path + ptfile + ".gpg")
print(status.ok)
print(status.stderr)
Run Code Online (Sandbox Code Playgroud)
当我将此文件作为python3 encrypt.py file.csv执行并且结果为file.csv.gpg时,效果非常好
我试图将其移至 AWS Lambda 并在 file.csv 上传到 S3 时调用。
import json
import urllib.parse
import boto3
import gnupg
import os
import os.path
import time
s3 = boto3.client('s3')
def lambda_handler(event, context): …Run Code Online (Sandbox Code Playgroud) 一个文件夹中有15个文件,都带有gz扩展名.我想加密其中的12个并跳过3个文件.有没有办法做到这一点?所有文件名都不同,可能也可能不以同一个字母开头.目前正在做:
gpg -r 'name' --encrypt-files $source/*.gz
Run Code Online (Sandbox Code Playgroud)
假设文件名是apple.gz,alabama.gz,butter.gz,cake.gz,dog.gz,eagle.gz,oregon.gz,somename.gz;
我想用一个gpg命令加密除alabama.gz和somename.gz之外的所有文件; 我怎样才能做到这一点?
我们从第三方收到GPG加密文件.我正在修改一个C#程序,它找到加密文件,解密它们并删除加密文件.这一切都有效,除了在解密部分它提示一个phassphrase; 我知道密码,它在输入时有效.我需要在命令中传递密码,因此提示永远不会出现.
string CommandText = string.Format("echo {0}|gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase-fd 0 -o {3} -d {4}",
passPhrase, publicKeyRingPath, secretKeyRingPath, outputFullPath, encryptedFilePath);
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
string CommandText = string.Format("gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase {0} -o {3} -d {4}",
string CommandText = string.Format("gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase-fd {0} -o {3} -d {4}",
Run Code Online (Sandbox Code Playgroud)
以及其他几个变种.
这是运行GnuPG for Windows 2.1.0.57899
如果问题出在其他地方,那么主要是由我的前任编写的一堆代码:
public bool decryptInputFile(string encryptedFilePath, string outputFullPath, out string message)
{
message = "decryptInputFile: Started";
try
{
ProcessStartInfo …Run Code Online (Sandbox Code Playgroud) gnupg ×10
bash ×3
git ×2
pgp ×2
amazon-s3 ×1
aws-lambda ×1
c# ×1
emacs ×1
encryption ×1
exec ×1
json ×1
maven ×1
openpgp ×1
passphrase ×1
php ×1
python ×1
python-3.8 ×1
python-3.x ×1
shell ×1
sign ×1
sourcetree ×1
ubuntu ×1
windows ×1