2021年12月20日星期一

gpg

 

查看gpg工具版本号

% gpg --version
gpg (GnuPG) 2.2.21
libgcrypt 1.8.6
Copyright (C) 2020 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: /Users/user/.gnupg
支持的算法:
公钥: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
密文: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
    CAMELLIA128, CAMELLIA192, CAMELLIA256
散列: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:  不压缩, ZIP, ZLIB, BZIP2

创建密钥

% gpg --gen-key

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: test
姓名至少要有五个字符长
真实姓名: gpgtest
电子邮件地址: gpgtest@gpgtest.test
您选定了此用户标识:
    “gpgtest <gpgtest@gpgtest.test>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 721AD549AF7EE528 被标记为绝对信任
gpg: 吊销证书已被存储为‘/Users/user/.gnupg/openpgp-revocs.d/037C102307A3DEF80A15CB2A721AD549AF7EE528.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2021-04-10 [SC] [有效至:2023-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid                      gpgtest <gpgtest@gpgtest.test>
sub   rsa2048 2021-04-10 [E] [有效至:2023-04-10]

使用gpg --gen-key流程比较简略,许多参数自动使用默认配置,也可用使用gpg --full-generate-key来自定义完整流程:

% gpg --full-generate-key

请选择您要使用的密钥类型:
   (1) RSA 和 RSA (默认)
   (2) DSA 和 Elgamal
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
  (14) Existing key from card
您的选择是? 1
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(2048)
请求的密钥长度是 2048 位
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
这些内容正确吗? (y/N) y

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: gpgtest
电子邮件地址: gpgtest@gpgtest.test
注释:
您选定了此用户标识:
    “gpgtest <gpgtest@gpgtest.test>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 721AD549AF7EE528 被标记为绝对信任
gpg: 吊销证书已被存储为‘/Users/user/.gnupg/openpgp-revocs.d/037C102307A3DEF80A15CB2A721AD549AF7EE528.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2021-04-10 [SC] [有效至:2023-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid                      gpgtest <gpgtest@gpgtest.test>
sub   rsa2048 2021-04-10 [E] [有效至:2023-04-10]

默认会同时创建密钥对应的吊销证书。

密码限制:

  1. 至少8个字符
  2. 至少包含一个数字或特殊字符

创建吊销证书

% gpg --gen-revoke DCDECC17ADB5DC35

sec  rsa2048/DCDECC17ADB5DC35 2021-04-10 gpgtest (test gpg key) <gpgtest@gpgptest.test>

要为这个密钥创建一个吊销证书吗?(y/N) y
请选择吊销的原因:
  0 = 未指定原因
  1 = 密钥已泄漏
  2 = 密钥被替换
  3 = 密钥不再使用
  Q = 取消
(也许您会想要在这里选择 1)
您的决定是什么? 3
请输入描述(可选);以空白行结束:
> just a test
>
吊销原因:密钥不再使用
just a test
这样可以吗? (y/N) y
已强行使用 ASCII 字符封装过的输出。
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate

iQFBBCABCAArFiEEo0Rf+7oYz3Yv6FiX3N7MF6213DUFAmBxE8ANHQNqdXN0IGEg
dGVzdAAKCRDc3swXrbXcNa8VCAC1uk3A3p2Lo1mLTx7TSSAtLqlkv8c6555UmAXE
3loY8sWPviWgZIAoXenYD3FMMW5ioRee+w4/S23AdZVqkFRqkQfwOMpUAHUrAnid
U9kVIhaLO+D056c47IiykZxncVfL+rBVdAXMYQC4a1DqcwUcr4ojcqWyXDAvXLmV
W1dqU67XbZnV6ALNgKrprVv0hZwufM19eu0L3cRTSk8Le8xv2vepQQBFC+SXhT8n
F3fhygyrUkDQcOdszbAQnSNUqi+lxwjX6t0Gtpmmyilnid8J0mmVNvkavgMAIQwm
36K+2untc/A8UDYzqeELwEdpA9tabY2JzvgVdR/N1cRrdNMn
=fR5F
-----END PGP PUBLIC KEY BLOCK-----
已创建吊销证书。

请把这个文件转移到一个您可以藏起来的介质上;如果坏人获取到了这
份证书的话,那么他就能使用它并让您的密钥无法继续使用。把此证书
打印出来再存放到安全的地方也是很好的方法,以免您的保存媒体变得
不可读。但是千万小心:您机器上的打印系统可能会在打印过程中储存
这些数据,并使得其他人看到!

列出已有密钥

% gpg -k
/Users/user/.gnupg/pubring.kbx
---------------------------
pub   dsa2048 2010-08-19 [SC] [有效至:2024-05-11]
      85E38F69046B44C1EC9FB07B76D78F0500D026C4
uid           [ 未知 ] GPGTools Team <team@gpgtools.org>
uid           [ 未知 ] [jpeg image of size 6329]
sub   rsa4096 2014-04-08 [S] [有效至:2024-05-11]
sub   rsa4096 2020-05-11 [E] [有效至:2024-05-11]

pub   rsa4096 2020-05-04 [SC] [有效至:2024-05-03]
      B97E9964ACAD1907970D37CC8A9E3745558E41AF
uid           [ 未知 ] GPGTools Support <support@gpgtools.org>
sub   rsa4096 2020-05-04 [E] [有效至:2024-05-03]

pub   rsa2048 2021-04-10 [SC] [吊销于:2021-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid           [ 已吊销 ] gpgtest <gpgtest@gpgtest.test>

pub   rsa2048 2021-04-10 [SC]
      A3445FFBBA18CF762FE85897DCDECC17ADB5DC35
uid           [ 绝对 ] gpgtest (test gpg key) <gpgtest@gpgptest.test>
sub   rsa2048 2021-04-10 [E]

或者

% gpg --list-keys

删除密钥

首先删除私钥

% gpg --delete-secret-keys 721AD549AF7EE528
...

sec  rsa2048/721AD549AF7EE528 2021-04-10 gpgtest <gpgtest@gpgtest.test>

要从钥匙环里删除这个密钥吗?(y/N) y
这是一个私钥!- 真的要删除吗?(y/N) y

然后删除公钥

% gpg --delete-key 721AD549AF7EE528

pub  rsa2048/721AD549AF7EE528 2021-04-10 gpgtest <gpgtest@gpgtest.test>

要从钥匙环里删除这个密钥吗?(y/N) y

导出密钥

导出二进制形式的公钥

% gpg --output public.key --export 721AD549AF7EE528

也可以导出文本形式的公钥

% gpg --armor --output public.key --export 721AD549AF7EE528

导出二进制形式私钥

% gpg --output secret.key --export-secret-keys 721AD549AF7EE528

也可以导出文本形式的私钥

% gpg --armor --output public.key --export-secret-keys 721AD549AF7EE528

导入密钥

% gpg --import 密钥文件

导入的密钥可以通过公共服务器搜索

搜索密钥

% gpg --keyserver hkps://keys.openpgp.org --search-keys [name]

上传到公钥服务器

% gpg --keyserver hkps://keys.openpgp.org --send-keys 721AD549AF7EE528
gpg: 正在发送密钥 721AD549AF7EE528 到 hkps://keys.openpgp.org

获取密钥指纹

% gpg --fingerprint 721AD549AF7EE528
pub   rsa2048 2021-04-10 [SC]
      A344 5FFB BA18 CF76 2FE8  5897 DCDE CC17 ADB5 DC35
uid           [ 绝对 ] gpgtest (test gpg key) <gpgtest@gpgptest.test>
sub   rsa2048 2021-04-10 [E]

加密

加密文件demo.txt

% gpg --recipient [name] --output demo.en.txt --encrypt demo.txt

解密

% gpg --output demo.de.txt --decrypt demo.en.txt

签名

生成二进制形式的签名文件

% gpg --sign demo.txt

生成文本形式的签名文件

% gpg --clearsign demo.txt

生成二进制形式独立签名文件

% gpg --detach-sign demo.txt

生成文本形式独立签名文件

% gpg --armor --detach-sign demo.txt

签名+加密

% gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt

验证签名

% gpg --verify demo.txt.asc demo.txt
gpg: 签名建立于 六  4/11 16:14:14 2020 CST
gpg:               使用 RSA 密钥 A3445FFBBA18CF762FE85897DCDECC17ADB5DC35
gpg: 完好的签名,来自于 “gpgtest <gpgtest@gpgtest.test>” [绝对]

参考

Managing commit signature verification

Generating a new GPG key

GPG入门教程

2021年12月6日星期一

Android Studio Arctic Fox中-Xbootclasspath/p选项失效问题

 

问题描述

新项目中需要使用新的类覆盖系统framework里的类,在Android 4.1.3版本中配置如下:

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:<path to my framework jar file>')
        }
    }
}

在下载最新版本Android Studio Arctic Fox | 2020.3.1 Patch 3后,运行报错,新类里的方法、变量都无法识别,新增的类也无法识别,以上配置已失效

问题原因

网上搜索,发现是java 9版本中移除了java -Xbootclasspath-Xbootclasspath/p选项:https://www.oracle.com/java/technologies/javase/9-relnotes.html,建议使用JEP 261中描述的--patch-module选项。

然而无法找到如何在Android Studio中配置--patch-module选项的方法。

解决方法

目前自己摸索加网上搜索找到了两种方法:

降级jdk

Android Studio Arctic Fox | 2020.3.1 Patch 3默认使用了内置的jdk11,手动配置选择使用旧版本的jdk1.8可以解决问题

这个方案有局限性,编译用的jdk被限制在jdk1.8及以下版本

使用bootstrapClasspath选项

https://blog.csdn.net/zou249014591/article/details/109752786这篇博文中介绍了如下方案:

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        Set<File> fileSet = options.bootstrapClasspath.getFiles()
        List<File> newFileList =  new ArrayList<>();
        newFileList.add(new File("<path to my framework jar file>""))
        newFileList.addAll(fileSet)
        options.bootstrapClasspath = files(
                newFileList.toArray()
        )
    }
}

同样解决问题,这个方案使用jdk1.8jdk11都可以编译

--patch-module选项

官方建议采用--patch-module选项来替换-Xbootclasspath/p选项,目前还没研究出来怎么配置

TODO

参考

-Xbootclasspath/p is no longer a supported option

JDK 9 Release Notes

android编译 配置-Xbootclasspath/p优先级无效(AndroidStudio升级到4.2.2后失效,或者jenkins 多模块依赖不同framework.jar导致失效)

2021年12月1日星期三

Could not open a connection to your authentication agent

添加ssh key时出错:

$ ssh-add ~/.ssh/id_rsa
Could not open a connection to your authentication agent.

解决:

$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/id_rsa

参考:

Could not open a connection to your authentication agent

Android logcat

Log等级 Android log 等级在 android/log.h 中定义如下: typedef   enum   android_LogPriority {    /** For internal use only. */ ANDROID_LOG_UNKNOWN =...