分类 软件技术 下的文章

vi或vim快速指引

前言

之前学习过vim编辑器,这是一款很棒的编辑器,它在很多Linux系统中有提供,使我们可以在shell中编辑文件。然而某些环境下只提供了vi编辑器,而vi编辑器的操作和vim有部分不同,所以我花了点时间将基本操作整理了一下。不要求自己完全掌握这两款工具,只为保证遇到只有vi的环境可以编辑文件。

vi / vim最最最基本的操作流程:使用vi或vim后跟随文件名打开文件,在此时所处的命令模式下通过方向键找到要修改的地方,按shift+x向前删除内容,按a进入插入模式,使用键盘输入要改的内容。输入完成后按ESC回到命令模式,输入 :wq 按回车保存退出,弄烂了不想保存则输入:q! 按回车强行退出。

创建文件:

创建文件是很简单的操作,我们可以使用系统内置的 touch 命令创建一个文件。

touch test.txt

也可以使用vi或vim来创建,如果此处没有这个文件。如果有这个文件的话执行此命令是打开文件。此命令后面的参数可以是相对路径也可以是绝对路径

# vi:
vi test.txt

#vim:
vim test.txt

此命令执行后vi或vim会打开并处于命令模式,想要正式保存退出,可以按 Esc键 确保进入命令模式,然后按 : 进入底行(扩展命令)模式,输入 wq 命令按回车键创建保存退出。

编辑器工作模式:

使用vi和vim编辑器首先要了解工作模式的概念,类似的,它们均提供了常用的三大模式。此处列表对比:

vi vim
命令模式(Command Mode)
打开时默认模式,按Esc进入
用于一般按键命令操作,如快速移动光标、复制删除等。
命令模式(Command Mode):
打开时默认模式,按Esc进入
用于一般按键命令操作,如快速移动光标、复制删除等。
插入模式( INSERT Mode)
命令模式下按 ai 进入
用于文本输入
插入模式( INSERT Mode)
命令模式下按 ai 进入
用于文本输入
末行模式(Last line Mode)
命令模式下按 : 进入
扩展的命令输入,比如保存和退出(wq)。
扩展命令模式(Extended Command Mode)
命令模式下按 : 进入
扩展的命令输入,比如保存和退出(wq)。
vi 无此模式 可视模式(VISUAL Mode)
命令模式下按 v 进入
此模式包含可视内容选择操作。

vi和vim在打开时默认处于命令模式,此模式用于移动光标,定位编辑点,复制删除内容。当我们将光标移动到目标编辑点后,进入插入模式以使用键盘键入内容。若完成某位置内容键入后想要移动光标,则回到命令模式重复操作。若完成编辑需要退出,也是先回到命令模式,然后进入扩展命令模式,输入相关命令退出。命令模式是一切的开始,其他模式都需要从此进入,退出其他模式也将回到命令模式。

vi和vim在工作模式方面操作基本一致,只是vim多了一个可视模式。此功能在我们简单编辑文件时意义不大。以上大致的说明了编辑过程中三大模式该在什么阶段使用。

插入模式:

所谓插入模式就是能够打字输入的模式。使用 i 键进入插入模式,光标保持不动;而使用 a 键进入插入模式将使光标自动后退一位,退出模式时光标会前进一位。顺便一提, 按键 I、A、O 均有进入插入模式的功能,且分别使用大小写键入时效果不同,有兴趣可自行尝试或参阅:vim非完全学习手册

注意:部分环境中的vi(例如处于vi兼容模式下的vim)无法在插入模式下通过方向键移动光标,其表现为按 上下右左 键会出现字符ABCD,这可能与我们常见编辑器的操作不同。此时我们可能需要按 Esc 键回到命令模式才可通过方向键移动光标。以上不难看出,使用 a 键进入插入模式明显更符合大多操作习惯。

注:导致以上问题原因可能有很多,也有不同办法可以处理,如果是vim处于vi兼容模式导致的此问题,可以在扩展命令模式执行set nocp 命令使其退出兼容模式解决。参考链接中提供了一篇相关文档供参考。

命令模式:

vi和vim编辑器打开时默认处于命令模式,vim可能会在左下角标记-- INSERT --以指示插入模式,但vi可能没有。如不在或不确定是否处于命令模式,请按Esc键进入。

注意:vi和vim编辑器命令模式下输入的命令,无论单字符还是组合键,都是大小写敏感的,操作时请注意大小写!

光标的移动:

事实上,简单的编辑并不需要了解太详细的光标移动操作,会使用方向键移动光标也能完成。了解光标移动可以快速定位编辑位置,追求尽快开始使用可以跳过本节。

  1. 使用键盘上的方向键移动光标,但考虑更高效的使用,也可尝试学习vim的命令键:h(左)j(下)k(上)l(右)。
  2. 按键 0 快速跳至当前行首;使用按键 $ 快速跳至当前行末。(注意:$需使用Shift+4实现)
  3. 使用 gg 按键快速跳至首行;使用 G 按键快速跳至末行。(注意前者时按两次g,后者通过Shift+G实现)
  4. 使用 Ctrl+f 向后翻一整页,使用 Ctrl+b 向前翻一整页。(使用键盘上的 Page UpPage Down 也可实现)
  5. 使用 7 G 按键快速跳至第七行;即通过按出 行号后再加大写字母 G (即Shift+G),即可快速跳转至指定一行。
  6. 可以使用 /string 命令从内容中查找关键词;string表示字符串,即输入关键字进行查找;我们可以使用(n/N)在查询到的多个结果中上下移动箭头。我们可以使用 /^string 这种,关键字前加 ^ 符号,指定搜索以此关键字开始的行; 使用/string$ 这种,关键字后加$符号,指定搜索以此关键字结尾的行。

编辑命令:

  1. x 键可删除光标所在字符,按 X 键(大写,即 Shift + x )删除光标前的一个字符。注意,虽然大多版本的 vi 或 vim 中可以直接按 Backspace 键向前删除,但某些环境中的 vi 、或某些版本的 vi 中Backspace是无效的,所以需要牢记标准操作。追求尽快开始使用着本节剩余内容可以跳过。
  2. 使用 dd 剪切光标所在行内容;使用 5dd 剪切光标及以后共5行。此命令常用于删除行。
  3. 使用 yy 复制光标所在行内容,使用 p 键将复制或剪切的内容粘贴(paste)到光标处。
  4. 使用 u 撤销(undo)之前的操作,使用 Ctrl+r 组合键重做(redo)撤销的操作。

退出:

  • 命令模式下,按住Shift键按两次 z 键,即输入 ZZ 即保存并退出。安全考虑,此方法不建议使用,建议使用扩展命令模式下的退出命令。

扩展命令模式:

在命令模式下按 :(即Shift+;) 键进入扩展命令模式。此模式亦有人称其为末行模式或底行模式(可能于命令于末行输入有关)。在扩展命令模式下,输入扩展命令然后按回车键执行命令。如需从此模式回到命令模式,按 Esc 键。

保存与退出:

  1. 在扩展命令模式下,输入w回车可保存文件。
  2. 在扩展命令模式下,输入q回车可退出,但文件有未保存更改时会失败。
  3. 在扩展命令模式下,输入wq回车可保存并退出。
  4. 在扩展命令模式下,输入w!回车可强行保存。
  5. 在扩展命令模式下,输出q!回车可强行退出,不保存退出。
  6. 在扩展命令模式下,输入wq!回车可强行保存并退出。
  7. 在扩展命令模式下,输入x回车可保存并退出,此处x为小写,大写X为添加密码,慎用!

环境配置:

vi/vim编辑器的设置,称之为环境配置。注意某些vi编辑器可能没有此功能。

# 设置显示行号
set nu

# 取消显示行号
set nonu

# 关闭 vi 兼容模式
set nocp

总结:

想要vi和vim都用的好,建议养成以下操作习惯:避免在插入模式使用方向键移动光标,使用 a 键进入插入模式而不是使用 i 键,使用 x 键或 X 键(大写,即 Shift + x )删除字符,而不是使用 Backspace

参考:

为JustHost.ru的CentOS7小鸡开启IPv6

前言

笔者有个从JustHost.ru购买的新西伯利亚小鸡,用途懂得都懂,不懂得,说了你也不明白,不如不说。你们也别来问我怎么了,利益牵扯太大,说了对你们也没什么好处,当不知道就行了。小鸡很便宜,服务页面很简陋,购买后会把一些机器信息发送到注册邮箱。一直以为这么便宜的机器有IPv4就行了,万不会提供IPv6。后来偶尔看到管理页面上标识有IPv6地址,看了一下购买时的邮件,邮件中有IPv4和IPv6地址和网关等信息。尝试Ping提供的IPv6地址提示无法访问目标主机,通过在小鸡上运行 ip a 命令查看其只配置了IPv4网络信息。官方支持IPv6但没有配置IPv6信息导致无法使用IPv6的情况,我们只需要在为网卡添加IPv6信息即可。

注:本文中涉及的敏感信息包括不限于MAC地址与IP地址等均为编造,非笔者所有,如有雷同纯属巧合!

操作

  1. 找到购买小鸡时的邮件,以获取IP配置信息。

  2. 小鸡执行 ip a 命令,查看所有网卡的信息。一般会有两个接口,其中 lo 是回环接口,那么另一个应该就是网卡了,比如笔者这里的名称是 eth0 。此处我们应该会看到一个开头fe80的本地v6地址,但没有服务商分配给我们的公网地址。

    [root@XXX ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 55:55:aa:aa:55:aa brd ff:ff:ff:ff:ff:ff
        inet 8.8.8.8/24 brd 8.8.8.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet6 fe80:::::8/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
  3. 使用以下命令确认eth0配置文件的存在,正常应该可以看到名为 ifcfg-eth0 的配置文件。

    [root@XXX ~]# ls /etc/sysconfig/network-scripts/
    ifcfg-eth0      ifdown-post      ifup-bnep   ifup-routes
  4. 使用以下命令备份 ifcfg-eth0 文件为 ifcfg-eth0.old

    [root@XXX ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.old
  5. 使用 nano /etc/sysconfig/network-scripts/ifcfg-eth0 命令打开配置文件,参考购买时官方邮件为其添加IPv6信息。主要修改 IPV6INIT参数为:yes,并随后添加IPv6默认网关和地址信息。

    ...
    IPV6INIT="yes"
    IPV6_DEFAULTGW=2a00:b700:1::1
    IPV6ADDR="2a00:b700:1:3e::175/64"
    ...
  6. 修改完后按 Ctrl+O ,然后直接按 Enter 键保存。按 Ctrl+X 键退出NANO编辑器。

  7. 运行以下命令重启网络服务。(也可以使用systemctl restart network命令)

    [root@XXX ~]# service network restart
    Restarting network (via systemctl):                        [  OK  ]
  8. 此时,再次查看eth0接口信息,应能看到新添加的IPv6地址,通过以下命令可以查看特定接口的信息。

    [root@v119813 ~]# ip a show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 55:55:aa:aa:55:aa brd ff:ff:ff:ff:ff:ff
        inet 8.8.8.8/24 brd 8.8.8.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet6 2a00:b700:1:3e::175/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80:::::8/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
  9. 如果正常,此时在我们本地应可以Ping 通 小鸡的IPv6地址了。

参考

使用RTL2832电视棒接收ADS-B信号追踪飞机飞行轨迹

前言

无线电技术在当今世界非常重要,从生活中的遥控小玩具到我们通信的手机,再到航空航天,无时无刻不起到重要作用。从麦克斯韦提出电磁场理论并预言了电磁波存在,到业余无线电爱好者发明早期的“电报装置”-“火花电台”;无线电技术的时代就拉开了序幕。随着电子技术的发展,半导体技术到超大规模集成电路的发展,也让无线电通信技术从模拟通信转向数字通信。如今在一个芯片上集成调制解调、编码解码、发射接收已经成为一件非常简单的事情。但是如此高的集成度,便意味着编解码算法的的升级换代需要更换整个芯片处理,这既是浪费也是麻烦,于是人们就想有没有办法设计一套硬件,其信号的编解码、调制解调等都可以通过软件数据定义实现,硬件只提供一个信号发射接收的平台。于是软件定义无线电的概念便出现了。

RTL2832电视棒的价格非常便宜,只需要人民币50元左右即可在淘宝买到。它是基于瑞昱RTL2832方案实现的一个USB DVB-T电视调谐接收器,将其插在电脑USB口上,安装一个软件就可以在电脑上接收电视节目。目前中国大陆用它看电视可能够呛了,也许国外可能有市场吧。国外某大佬发现RTL2832有个特殊模式,可以直接将原始数据传输到电脑上,其工作频率大约在20M~1700M范围。随后几位大佬逆向了这货的驱动程序、接口,成功的把原始数据拉到了电脑上,然后他们开发了各种处理这种原始数据的程序,为我们带来了低廉的软件定义无线电方案。更多硬件相关资料见文末参考链接

入手此物后作为入门的第一件事自然就是跟随前辈的脚步,复现使用其配合SDR#接收FM广播的用途。国内应该不会有人买这货看电视吧!主要操作就是下载SDR#,解压并运行内部的一个批处理下载扩展文件,使用zadig替换驱动程序并最终运行SDR#接收FM广播。确定无误后可以尝试接收民航频段与对讲机频段。通过这些操作,你已经初步领略了软件定义无线电的魅力,同一个硬件,可以收FM广播频段,也可以收对讲机使用的430M频段;可以按调频的方式解,也可以按条幅的方式解,而这设备只需要人民币50元左右,这便是软件定义无线电的优点。以上这些都非常简单,本文就不再赘述。

本文目标是接收ADS-B信号以追踪飞机飞行轨迹。民航飞机为了安全性等原因,设计了一个ADS-B发信机,具体历史不再赘述。飞行中它不断的向周围发送一个ADS-B信号,信号频率为1090MHz,信号中包含了飞机的ICAO编码、飞机航班号、机型、经纬度、当前高度、目标高度、速度、航向角等信息。我们接收这些信息后就可以在地图中标记出飞机的位置,了解到飞机的航线,通过航班号我们可以在互联网上查到这架飞机的航线等信息。

操作

整个过程并不复杂,大致如下:首先下载相关工具,将电视棒接好天线通过USB接口与电脑连接并安装驱动程序;配置软件RTL1090,其解码RTL电视棒获取的数据并在本地搭建一个服务端。然后安装配置VirtualRadar,其提供一个可以通过浏览器访问的图形界面。以下为详细过程:

安装配置RTL1090套件

  1. RTL1090官网下载RTL1090-IMU,按官网介绍,这是一个安装和维护工具,它通过网络获取最新版本的RTL1090主程序以及RelWithDebInfo与zadig。RelWithDebInfo是RTL_SDR工具包,它提供各种访问接口;zadig则是驱动程序。

  2. 在欲安装的位置新建一个文件夹,名称自拟。将RTL1090-IMU的程序解压到文件夹中,将RTL2832电视棒插入到USB接口,双击运行。在主界面的Install and Update页面右侧点击New Install然后选择操作系统,然后点击Return to application folder按钮将安装目录设置为当前文件夹。继续等待安装工具完成相关文件的下载,这个过程中工具会自动解压相关资源并放在正确的位置。

  3. 等待其完成安装后,Zadig会自动运行,若出现UAC提示,请同意其管理页权限。参考安装工具的提示完成驱动安装并关闭RTL1090-IMU。具体如下:

    在Zadig中勾选Options->List All Devices,然后在设备列表中尝试选择BULK-IN INTERFACE (INTERFACE 0)或类似RTL2832XXX字样的设备。选定后应该能在下方的USB ID中看到0BDA:2832或0BDA:2838字样,即为正确选择设备。箭头右侧应选择WinUSB而不是其他,然后点击下方的Install Driver按钮开始安装驱动,完成后关闭Zadig。

  4. RTL1090官网下载最新版主程序包,覆盖解压到之前建立的安装目录。

  5. 双击运行 rtl1090.exe ,点击START按钮若出现防火墙提示,请允许。这样便完成了RTL1090的配置。此时正常应能收到上空经过飞机的信号了,相关信息可以在Table选项卡中看到。

安装配置VirtualRadar

  1. VirtualRadar官网下载Virtual Radar Server并安装,安装过程中Server Port页面可以设置网页访问的端口。然后下载Database Writer Plugin选择同一目录安装。
  2. 右键管理员权限运行主程序,点击Tools->Options,在左侧选择Receivers->Receiver。在右侧点击Wizard按钮打开接收器配置向导,Kind of receiver选择A software defined radio,Decoder program选择RTL1090,是否运行在本地选择Yes,然后点击Finish完成向导。
  3. 此时点击Test Connection按钮,应该会弹出Connection can be made的提示,如果不正常请检查防火墙设置、软件配置等信息无误,并尝试重启RTL1090和Virtual Radar。若一切正常建立,RTL1090软件中右下的TCP图标应该会亮起。
  4. 确保右键管理员权限运行VirtualRadar,点击Tools->Plugins,在Database Writer中点击Options,勾选Enabled,点击Create Database后点击OK。
  5. 此时,访问本机IP:之前设置的端口号即可访问飞机追踪页面。点击Menu -> 第二个图标,将语言设置为中文。然后点击菜单->选项,勾选设置当前坐标,然后去地图上拖动地图到自己所在的区域,然后在此页面取消勾选。以此完成当前坐标的设置,这样每次打开页面便会默认加载正确的位置。
  6. 勾选通知所有已选择的航空器,可以在监测到飞机时语音播报相关信息。其他设置可自行研究。

参考

使用Adobe Acrobat修改带签名的PDF文档

前言:

PDF文档,即Portable Document Format,看名字就知道,这是一种便携式文档格式。它是Adobe公司设计的,主要目的是为了能提供高度一致的效果,而与打开文档的设备软硬件环境无关。我们平时查看PDF文档用的工具一般是Adobe Acrobat Reader DC,它是免费的;但它只是阅读器,不能修改PDF文档,我们一般使用付费的Adobe Acrobat或一些其他软件修改或打包PDF文档。某些特殊情况,我们可能需要修改的PDF文档存在签名(最常见的比如电子发票),而存在签名的PDF文档是无法修改的,而Adobe Acrobat没有去除签名的功能,此时该怎么办呢?

准备:

  • 要处理的文档
  • 一台安装了Adobe Acrobat软件的电脑一台

操作:

方法一:

  1. 准备好要修改的文档,准备好文档保存的文件夹并在资源管理器中打开,资源管理器中空白处鼠标右击 ,点击 新建 -> 文本文档 新建一个空白的TXT文件,名称随意,建议可使用最终PDF要保存的文件名。
  2. 打开Adobe Acrobat,依次点击 文件 -> 创建 -> 从文件创建PDF(或直接按 Ctrl+N ),在弹出的打开对话框中双击选择上一步新建的TXT文件打开。
  3. 点击:工具 -> 组织页面 ,在弹出的选项中点击 插入 -> 从文件(或直接按 Shift+Ctrl+I ),在弹出的对话框中双击选择原始PDF文档以完成选定。在弹出的 插入页面 对话框中,位置下拉列表选择 之前 ,设置好需要的页码范围,点击 确定 完成插入。
  4. 组织页面 功能下,使用鼠标单击选中创建PDF文档时产生的空白页面,点击 删除 按钮(或直接按 Del),在弹出的对话框中点击确定删除多余页面。
  5. 点击:工具 -> 编辑PDF ,这时便会发现,文档已经是可以编辑的状态了。使用键盘鼠标改动一番,然后点击 保存文件 图标或按 Ctrl+S ,在弹出的保存页面中选择保存的路径,输入要保存的文件名,点击 保存 图标或按 Alt+S 完成保存。最初创建的空白TXT文档也可以删除了。

方法二:

  1. 准备好要修改的文档,准备好文档保存的地方,使用Adobe Acrobat打开文档。
  2. 点击:工具 -> 组织页面 ,页面范围选择 所有页面 ,点击 提取 选项,保持 “在提取后删除页面” 和 “将页面提取为单独文件” 未勾选,点击 提取 按钮完成提取。
  3. 点击:工具 -> 编辑PDF ,这时便会发现,文档已经是可以编辑的状态了。使用键盘鼠标改动一番,然后点击 保存文件 图标或按 Ctrl+S ,在弹出的保存页面中选择保存的路径,输入要保存的文件名,点击 保存 图标或按 Alt+S 完成保存。

明显,方法二步骤更简单一些。

注:本文只针对未加密的已签名PDF文档有效,且修改保存后文件的签名也不复存在。不同版本操作可能会有变化,请自行观察软件功能,灵活操作。本方法可能随着软件版本更迭而失效,本文使用的软件版本是:2019.008.20080。

PGP加密电子邮件通信——使用Thunderbird搭配内置OpenPGP收发加密邮件

前言

The natural flow of technology tends to move in the direction of making surveillance easier,

the ability of computers to track us doubles every eighteen months.

----Phil Zimmermann

众所周知,通过互联网传输的的数据很容易被第三方监听和篡改。而我们发送电子邮件时,其数据会通过运营商线路发送到发件人邮件服务提供商的服务器,由服务商的服务器将电子邮件投递到收件人邮箱对应服务商的服务器,最终收件人从服务器上接收邮件。虽然目前绝大多数服务商支持传输过程的TLS加密,这基本杜绝传输中的泄密。但是,邮件原文仍会在双方邮件服务提供商的服务器上留存,这里留下了泄密的风险。如果有一种方案,在发件方发送前本地加密,收件方收到后本地解密,这样就避免了传输过程泄密和篡改。那么如何实现呢?

PGP(Pretty Good Privacy)中文可以翻译成:很不错的隐私。它是一种加密程序,可以为数据通信提供加密和身份验证。PGP可以用于对文本、邮件或文件进行签名、加密和解密。菲尔·齐默尔曼(Phil Zimmermann) 于1991年开发了PGP的最初版本,其最初用户为集权国家持不同政见者、民权主义者和密码朋克的“自由交流”活动家。PGP发布不久,便在美国以外的地方被使用。1993年齐默尔曼被美国政府以“无证出售军火”调查,因为当时美国法律规定大于40位密钥的密码系统被视为"军火",而PGP从未使用低于128位的密钥。菲尔·齐默尔曼以富有想象力的方式挑战了这些规定,他将PGP的源代码通过写成一本书出版了。因为枪支弹药、飞机和软件的出口被限制,但书籍的出口受第一修正案保护。几年后,调查以没有提起任何诉讼而结束。

联邦刑事调查结束后,菲尔·齐默尔曼和他的团队成立了一家公司开发PGP。PGP在随后的几年辗转倒手几家公司,作为一个商业软件,它遇到了一些专利问题,这导致它的使用遇到很多问题。而菲尔·齐默尔曼深信,PGP加密的开放标准对他们和整个加密社区都至关重要。后来IETF应其要求便成立了OpenPGP工作组。后来自由软件基金会开发了一个兼容OpenPGP标准的程序,称为GNU Privacy Guard,简称GnuPG或GPG。

可能有人注意到,在当下,某些对于信息安全比较注意的博主,或是独立调查记者、社会活动家。他们的个人网站电子邮箱附近会留有一个PGP KEY,其后跟着一个40位16进制数。这个数字实际是PGP公钥的指纹,通过它可以在公共PGP公钥分发服务器上找到其对应的完整公钥。有了PGP公钥,我们便可以向其发送加密后的电子邮件了,电子邮件在到达对方的邮件客户端前的整个传送过程,一直都是密文。而除非窃听者获取了对方的私钥,否则无法获取到原文。

Thunderbird是一款开源免费的电子邮件客户端,用于发送,接收和存储电子邮件,分别支持Windows、MacOS、Linux等平台。它目前由开源社区负责维护,它被PRISM BREAK项目所推荐。之前它需要搭配Enigmail插件使用OpenPGP加密,目前Thunderbird 78 原生支持两种加密标准,OpenPGP 和 S/MIME,所以不再需要插件。官方文档描述,Thunderbird 78 OpenPGP标准支持是通过RNP实现的。

实践本文内容前,您可能需要知晓以下内容:

  • 准备一个电子邮件账户,需要服务提供商支持IMAP或POP3协议

  • 如果对安全要求较高,需确认当前系统无恶意软件

  • 如果对数据安全要求极高,建议全盘加密

本文描述的方法用于避免传输过程中邮件内容被窥探,用于证明发件人身份。对于发送前的内容泄密、私钥泄露等皆无力应对;且随着技术发展,此方法并非能够永远安全,请谨慎。

1. 安装Thunderbird并配置邮件账户

  1. Thunderbird的安装非常简单。大多Linux发行版都默认安装了它。而在Windows下的安装也非常简单,只需要从官方网站下载适合您语言和系统的安装程序,然后运行安装程序跟随提示安装即可。如果需要修改安装位置可以选择自定义,然后修改安装位置,其他不再赘述。

  2. 安装完成后运行Thunderbird,会提示您配置邮件账户。如果您关闭了这个窗口,可以点击菜单键(其在主窗口关闭下方,图标是三根横线,下文简称三横菜单键),在菜单中点击新建 > 已有电子邮件账户... ,打开邮件账户配置窗口。
    1-0.png

  3. 按提示填写发件时显示的名字,电子邮件账户地址,密码,然后点击 继续

    1-1.png

  4. Thunderbird会自带尝试检索邮件服务器配置信息,如果找到,会自动在下方列出。如果检查到的信息与您实际情况相同,可以直接点击 完成 按钮,完成电子邮件账户的添加。

    1-2.png

  5. 如果找不到,或找到的配置信息不正确,您可以点击 手动配置(M)... 按钮,手动填写从邮件服务商处获得的服务器信息。填写无误后点击 完成 按钮,完成电子邮件账户的添加。

    1-3.png

警告:请确保以上配置中“接收”和“发出”均配置了SSL(安全套接字层)或STARTTLS(启动传输层安全性),这保证您与电子邮件服务商的网络连接是加密的。

注意:如果您电脑系统登录的是公用账户,请不要勾选记住密码。为了数据安全,不建议在公用账户做加密邮件通信。详细参考该官方文档

注意:某些邮箱,例如网易邮箱、Gmail,可能不再支持使用网页登录的密码连接POP和IMAP服务,需要在网页端按提示生成专用的连接密码。

2. 生成并配置密钥

配置好电子邮件账户后,接下来便是通过内置的OpenPGP密钥管理器生成密钥对。

  1. 在主界面点击三横菜单键 > 账户设置 ,在左侧您的邮箱下的选项中选择 端到端加密 ,在右侧界面的OpenPGP栏目中点击 OpenPGP密钥管理器(K) 按钮以打开OpenPGP密钥管理器。(密钥管理器 也可以从 三横菜单键 > 工具中访问)

    2-1.png

  2. 点击上方菜单栏中的 生成(G) > 生成新密钥对(K) ,弹出的新建OpenPGP个人密钥窗口。在身份标识处选择您使用的邮箱。密钥到期日建议选择到期时间2年或3年,不建议设置永不过期。密钥类型选择RSA,密钥大小选择4096,点击 生成密钥 按钮,在接下来的页面中会询问您是否确定生成,核对无误点击确定等待片刻即可生成密钥对。

    2-2.png

  3. 关闭密钥管理器,此时应该能够在OpenPGP栏目中看到新添加的密钥。点击选中新添加的密钥,即可将该密钥对应用于此电子邮件账户。

    2-3.png

可选安全配置:为了更高的安全性,有以下可选项设置,但以下设置会导致易用性下降。

  • 禁用远程内容。这个设置在选项 > 隐私与安全 中 ,允许消息中的远程内容,此选项默认设置就是不启用的。关闭此选项可在一定程度上降低邮件远程内容加载项带来的攻击风险。
  • 禁用HTML电邮呈现。打开 三横菜单 ,点击 查看 > 消息体为(这个翻译太草了) ,此处默认是原始HTML,将其设置为 纯文本 可以更大程度上避免HTML加载项导致的黑客攻击,但会导致大量HTML格式的邮件呈现为几乎不可读的状态。建议只在安全要求极高的情况下使用。
  • 禁用HTML电邮撰写。此设置在账户设置 > 通讯录选项 下 。编写以HTML格式编写消息 默认为勾选状态。如果要使用纯文本方式撰写邮件,需要把此勾选去掉。
  • 启用默认签名与加密。此设置在 账户设置 > 端到端加密 下。将 发送消息时的默认设置 改为 默认要求加密 ,勾选默认添加我的数字签名。这个设置可以避免忘记加密将邮件发出。但会给平时不发送加密邮件的场景带来麻烦,按需启用。
  • 将草稿和模板保存在本地。此设置在 账户设置 > 副本和文件夹 下,将草稿和模板的保存文件夹设置在本地,而不是邮箱的远程文件夹中,这可避免未完成的、未加密的草稿被自动上传至邮件服务商处,此设置按需配置。

导出私钥:

导出私钥备份到安全的地方可以降低意外导致私钥丢失的情况。私钥丢失将导致您无法解密他人发送给您的加密邮件,这也是一件令人尴尬的事情。同时,Thunderbird中自带的OpenPGP密钥管理器功能有限,后续的发布操作也需要导出到GnuPG完成。

运行Thunderbird,三横菜单键 > 工具 > OpenPGP密钥管理器。在密钥管理器中选定要导出的项目,然后点击 文件 > 备份私钥为文件 。在弹出的窗口设置保存的位置与文件名称后点击保存,然后在弹出的设置密码窗口中设置密码,最后点击确定完成导出。

2-4.png

注意:此处生成的密钥对包含私钥和公钥。私钥需要安全保存,绝对不共享给其他人。公钥您可以公开分享给信任你的人。具体的使用会在后面的内容中讲述。

3. 加密邮件的发送和接收

要实现加密邮件双向收发,需要双方分别拥有自己的密钥对,并且互相持有对方公钥。这需要一个交换的过程,通常可以将公钥导出,作为附件发送给对方。然后通过电话、线下见面等方式核对公钥的指纹,确保对方收到的公钥没有问题。以下假设Alice和Bob两人要交换公钥。

  1. Alice打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 将密钥导出为文件 ,选择合适的地方保存,这就是导出的PGP公钥。Alice给Bob发送一个未经PGP加密的邮件,将刚才导出的PGP公钥作为附件发送。此步骤可简化为:Alice打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 通过电子邮件发送公钥

    3-1.png

    在弹出的邮件撰写窗口中填写Bob的邮件地址并完善标题与正文内容,确定安全选项下为不加密,点击发送即可。

    3-1-1.png

  2. Bob收到邮件后,下载附件中Alice的公钥。打开OpenPGP密钥管理器,点击 文件> 从文件导入公钥 ,选择Alice的公钥。在弹出的要导入下列密钥吗?的窗口中会显示当前导入公钥的指纹,通过其他可信途径与Alice核实指纹是否正确,核对无误后选择 接受 ,然后点击确定。在新弹出的成功信息页上点击 查看详细信息并管理密钥接受度 ,在 您是否接受 选项下选择 接受,我已验证这的确是正确的指纹 ,点击确定键完成设置,然后关闭密钥管理器。

    3-2.png

    3-2-1.png

  3. Bob完成Alice公钥的导入后,打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 通过电子邮件发送公钥 ,在弹出的邮件撰写窗口中填写Alice的邮件地址并完善标题与正文内容,点击 安全 右边的下拉按钮,选择 要求加密 选项,点击发送即可将公钥和邮件以加密的方式完成发送。而加密后的内容只有Alice的私钥能够解密。

  4. Alice收到邮件后,Thunderbird会自动使用Alice的私钥解密邮件内容。Alice下载附件中Bob的公钥,参考步骤2的过程将Bob的公钥导入自己的OpenPGP密钥管理器。到此双方便可以互相发送加密邮件了。结果如下图所示。

    3-4.png

还有一种方法是将公钥发布到公钥服务器上,然后双方通过可信的途径交换公钥的指纹。让对方通过指纹或密钥ID来搜索并获取公钥。然后添加时核对指纹,如果没有差异即表示正确的交换了公钥。如何将公钥发布到公钥服务器会在后面内容中讲述。

4. 延长过期密钥

若要延长过期的密钥,在密钥管理器窗口中选择过期的密钥对,右键菜单选择 密钥属性 ,然后在打开的窗口中点击更改到期时间,重新设置到期时间(建议2~3年),密钥对会被更新。之后需要重新与通信伙伴们分享公钥。如果有在公钥服务器上发布,则需要重新发布以更新。

4-1.png

注:该部分笔者没有实际尝试操作,仅供参考。

5. 公钥发布与吊销

上文内容已经实现了PGP加密邮件通信。此处研究一下通过公共密钥服务器发布自己的公钥。这个活单纯靠Thunderbird搞不定,因为它没有这样的功能。为此,我们需要安装一个GnuPGP软件包,因为本文环境为Windows系统,所以需要下载安装Gpg4win。然后使用它将公钥发布到公钥服务器上。

安装Gpgwin:

  1. 从官网下载Gpg4win安装程序,双击运行安装程序,点击 下一步

    5-1.png

  2. 按需要从可选组件中选择要安装的组件,Kleopatra是一个窗口化的密钥管理器,GPA是GNU隐私助理,GpgOL是Outlook插件,GpgEX是资源管理器插件。本文只用到了Kleopatra的部分功能,还有部分操作用命令行淦。选择需要的功能后点击下一步。

    5-2.png

  3. 设置安装位置,建议默认位置即可。然后点击安装,等待其完成安装后退出安装程序。

    5-3.png

导入密钥对到GnuPG:

从Thunderbird中导出的私钥文件,在Gnu PG的图形化前端Kleopatra中进行导入。导入后加解密一段任意文本,以触发并完成私钥本身的解密流程。这是一个方法,如果安装了Kleopatra。否则我们也可以在命令提示符中完成。

  1. 使用以下命令进入备份目录(本例为E:\Sec\TEST\),并执行导入。会弹出一个输入密码的对话框,输入之前从Thunderbird中导出时设置的密码,然后点击OK完成导入。

    C:\Users\Lexsion>E:
    E:\>cd Sec\TEST
    E:\Sec\TEST>gpg --import Alice-secret.asc

    如图:

    5-B-1.png

    成功后有类似以下提示:

    gpg: key FFFFFFFFFFFFFFFF: "Alice <Alice@Alice.com>" imported
    gpg: key FFFFFFFFFFFFFFFF: secret key imported
    gpg: Total number processed: 1
    gpg:               imported: 1
    gpg:       secret keys read: 1
    gpg:   secret keys imported: 1
  2. 使用以下命令查看有哪些密钥,记下我们刚导入的密钥对的8位密钥ID,即指纹的后8位(本例为:67A7B3D5)。

    E:\Sec\TEST>gpg --list-keys

    部分缩写介绍:

    sec => 'SECret key'
    ssb => 'Secret SuBkey'
    pub => 'PUBlic key'
    sub => 'public SUBkey'
  3. 使用以下命令结合刚才获取到的指纹ID编辑密钥对,将信任等级改为完全信任。完成后退出。

    E:\Sec\TEST>gpg --edit-key 67A7B3D5
    gpg> trust
    
    Your decision? 5
    Do you really want to set this key to ultimate trust? (y/N) y
    
    gpg> quit

    如图:

    5-B-2.png

    5-B-3.png

编辑状态时,usage标记的解释:

Constant           Character      Explanation
─────────────────────────────────────────────────────
PUBKEY_USAGE_SIG      S       key is good for signing
PUBKEY_USAGE_CERT     C       key is good for certifying other signatures
PUBKEY_USAGE_ENC      E       key is good for encryption
PUBKEY_USAGE_AUTH     A       key is good for authentication

发布公钥到公共服务器:

我们仍假设8位公钥ID是“67A7B3D5”,使用以下命令将公钥发布到公共服务器“keys.gnupg.net”。您也可用发布到其他的服务器,主要的公共密钥服务器之间会定期互相同步的。

 gpg --keyserver keys.gnugp.net --send-keys "8D253E8A"

稍等片刻,我们可以尝试用以下命令查询服务器中是否已经有我们的密钥。

gpg --keyserver keys.gnugp.net --search-keys "user-name/e-mail/fingerprint"

撤销公钥:

公钥一旦发布到了公共的公钥服务器上,那便谁都可以获得了。如果哪天我们私钥丢失,无法解密;或是私钥泄露,不再安全怎么办?我们便需要一种机制,可以用来声明公钥已经失效,让大家不要再使用。于是便有撤销公钥的操作,原理便是用私钥签一个公钥回收证书,加入到原有的密钥链中。注意:为了更大程度保证此操作可用,公钥回收证书建议在发布公钥前导出,妥善保管,若需要撤销公钥时直接导入,避免丢失公钥,无法生成撤销证书。

使用以下命令生成回收证书,revoke.asc为文件名,文件会放在当前操作目录。

gpg --output revoke.asc --gen-revoke "8D253E8A" 

使用以下命令将公钥回收证书导入到公钥中。这个操作将在本地撤销公钥,使本地的公钥状态变成已失效(revoked) 。但不会影响已上传到公钥服务器中的数据。

gpg --import revoke.asc

使用以下命令搜索公钥服务器,以确定是否有这个公钥。

gpg --keyserver keys.gnugp.net --search-keys "8D253E8A"

确定服务端有这个公钥的记录之后,使用以下命令上传导入了回收证书的公钥,这样便更新了服务器上的记录。

gpg --keyserver keys.gnugp.net --send "8D253E8A"

稍后我们再使用前面的命令从公共公钥服务器上搜索,便会看到公钥的状态变成了(revoked)。以上即完成了公钥的撤销。

Q&A:

Q:PGP、OpenPGP、GnuPG、GPG、Gpg4win分别是什么,它们有什么关系?

A:相关的问题在前言中有部分提到,PGP是这项技术最早的开发者针对加密程序的命名,目前它是个商业软件,属于赛门铁克(Symantec)。OpenPGP是这项技术的标准,它是商业运作PGP过程中发现专利问题后为了更好发展提出的开放标准。GnuPG全称GNU Privacy Guard,它是自由软件基金会开发的一个兼容OpenPGP标准的程序,其又简称GPG,它是PGP的开源替代品。Gpg4win是一个Microsoft Windows下的软件包,其包含GnuPG核心程序、证书管理器和加密插件。除了OpenPGP作为技术标准名称,其他都是软件名称,他们几乎通用,但支持的加密算法会有不同。

Q:公钥、私钥、指纹、密钥ID分别是什么?

A:公钥用来加密和验证签名,私钥用来解密和签名。指纹是从公钥产生,长度为40位16进制数。密钥ID是公钥的ID,分为长ID和短ID两种,长ID是指纹的后16位,短ID是指纹的后8位。长短ID仅作为方便搜索使用,交换、使用公钥时务必完整核对指纹,避免碰撞攻击。

Q:导出的PGP私钥文件是否包含公钥?

A:导出的PGP私钥文件是包含公钥的,如果你尝试将导出的私钥在其他设备上导入,导入后便能看到其包含公钥。另外,可以使用pgpdump分析私钥文件来研究这个问题。

Q:私钥导出时要求我设置了密码,但是导入时没有提示输入密码就成功导入了?

A:导出私钥时设置的密码是有用的,私钥确实使用您设置的密码加密了。部分GnuPG公钥管理器是这么设计的,导入操作本身是不需要密码的,但是导入后的私钥仍在加密状态,这个状态的私钥是不能使用的。可以使用这个私钥解密一个文件,其会自动提示让您输入之前设置的密码以解锁私钥。本文使用的命令界面操作,没有遇到此问题。

Q:据说其他新的加密算法更加优秀,为什么还要用RSA?

A:为了保证更好的兼容性,所以还是建议选RSA。

Q:POP3和IMAP有什么区别,怎么选择?

A:POP3和IMAP是两种不同的协议,相比IMAP,POP3是一种简单协议。POP3协议将邮件移动到本地,尽管服务商处可以设置将消息保留在服务器上。而IMAP协议是访问、操作远程服务器上的文件夹,下载到本地的被称为副本。IMAP客户端可以对远程服务端的邮件执行各种复杂的操作,它支持通过读写远程服务端的标志以跟踪同步邮件的状态。POP3要求连接到邮件服务器的客户端是唯一 的,IMAP支持多个客户端同时访问。如果需要在多个客户端访问邮件,选择IMAP协议;如果需要邮件接收到本地,不想邮件保存在不受自己控制的服务商那里,选择POP3协议(前提是服务商处的设置确实会在邮件接收后删除邮件,据了解,主流服务商不是这样的,所以推荐IMAP)。

Q:在Android系统下该选择什么邮件客户端?

A:PRISM BREAK项目推荐K-9 Mail,这个应用在GitHub上有开源项目,可以看到完整的源代码。它可以在F-Droid应用市场下载,这个也是闻名的开源Android应用市场。相信开源的项目更让人放心,本人没有尝试过此应用,具体使用方法本文不研究。

参考:

Typecho设置表格样式

前言:

正如大家看到的,本博客使用R-Blog主题。这个主题风格简洁,但有些地方可能不完善,如下所示,表格的样式也太过简洁了,不仔细看都不知道这有个表格,以至于影响到阅读。作者已经好多年没有更新了,于是需要我自己想办法解决这个问题。本人在HTML与CSS方面没有任何系统的学习经验,更不懂PHP语言。本文只是对问题解决的记录,若有错漏请各位指正。

原始表格样式

开搞:

首先,我大致看了一下Typecho文件结构,文章看样子是由./var/HyperDown.php从Markdown生成的,那表格也是由它产生。而主题以文件夹形式放在./usr/themes/下面。这个结构,想来表格生成的那边不能随意改动,只能动主题文件夹里的内容。看了下主题文件夹中的内容,是一些PHP文件和一个CSS文件。

搜索引擎简单搜了一下,了解到PHP文件在服务端运行,产生HTML文档给用户的浏览器。HTML(HyperText Markup Language)是超文本标记语言,由多种通过标签定义的元素组成,表格元素由<table>标签定义。CSS(Cascading Style Sheets)中文叫层叠样式表,用所谓的样式规则来定义HTML元素如何显示,而且它是层叠的。一条CSS规则由前部的选择器和跟在后面大括号中的一条或多条声明构成,每条声明则由一个属性名和对应的组成。

如此看来,我想要修改表格显示的样式,就要改表格相关的CSS规则。我先去网上找了几位大佬们的博客快速的浏览了一番。为自己积累一些经验,顺便F12学习一下他们表格元素的某些样式对应CSS规则中什么属性。经过一番粗略的学习,我拥有了低级的审美观念,也了解了极为有限的一部分CSS属性名的作用,接下来就是学以致用了。

R-Blog主题CSS文件只有一个,结构极为简单,打开改就完了。读书破万卷,下笔也不定有神。我先将前面学到的、我认为有用的规则写出来,然后浏览器浏览实际效果,通过F12调试功能,增删改这些规则,最终再据此修改CSS文件中的规则。经过一段时间的尝试,最终我将table相关规则替换成了以下内容:

table{width:50%;border-spacing:1px;background-color: #22aaef;border: 1.5px solid #22aaef;}
table thead tr{font-size: 17px;color: #22aaef;background-color: #DDD;}
table thead tr th{padding: 4px;}
table tbody tr{background-color: #FFF;}
table tbody tr td{padding: 4px;}
table tbody tr:nth-child(2n){background-color: #e5fcfd;}

浏览器中按Ctrl+F5刷新后,表格出现了神奇的变化。最终效果如下,我感觉还是挺满意的,大家可以评论区告诉我好不好看。

修改后的表格效果

参考: