第一章 地方政府的权力和事务

  • 第一节 政府治理的特点
    • 五级政府管理体系:中央-省-市-县区-乡镇
    • 四套领导班子:党委、政府、人大、政协等,在五级政府下都完全复制
      • 条条块块:既有垂直的上下关系,又有横向的行政区划
      • 如县教育局受上级的市教育局管辖,又受县市政府管辖
    • 官僚体系
      • 官员学习和贯彻统一的意识形态
      • 由上级任命
      • 地方官在多地轮流任职
  • 第二节 外部性和经济规模
    • 公共服务
      • 覆盖区域使用人数越多越好
      • 行政区划的范围
      • 边远地区是否有必要建设公共服务
    • 人口密度
      • 云南-腾冲线:43%东边面积占了94%人口
      • 密度高的地方区划要小,密度低的地方区划要大
      • 政策上会对城市群进行规划,以打破交界
      • 人为划分意图消除边界不一定有好效果,主要还是受地理因素影响
    • 行政交界处
      • 交界处三不管,经济一般更差
      • 边界处交通网路会更疏
      • 环境问题,污染排向边界处
      • 长期看,需要进行深化的市场化改革
      • 中短期通过行政区划调整和都市圈
  • 第三节 复杂信息
    • 实际权威来自信息优势
    • 下级具有信息优势
    • 上级只有形式权威,办事最终还是要看下级意愿
  • 第四节 激励相容
    • 专业性较强的部门一般受垂直上下级的约束较大,如海关,工商部门等
    • 完全受垂直上下级管理,会减弱地方监管力度,因此需要平衡
    • 中央做好约束,同时也让地方发挥更大的自治权
  • 第二至第四节就是事权划分的三大原则
  • 第五节 招商引资
    • 地方政府给予企业土地开发支持
    • 地方政府给予企业金融支持
    • 地方政府给予补贴和税收优惠
    • 地方政府提供招工服务
      阅读全文 »

为什么网络游戏Wordle病毒式的传播,来听听心理学家的解释

近期有个网络游戏Wordle在推特上及其流行,这是字谜类的游戏。规则比较简单,玩家需要猜一个5个字母组成的单词。其特别之处在于拥有社交属性,即一盘游戏是需要好几个人参与的,通过不同色块提示字母和位置的正确与否,这样每个人都能看到别人猜的进度,形成一种竞争体验。

开源工具Arthas在线诊断java程序

Arthas是Alibaba开源的Java诊断工具,可以实现在线监控执行方法,观测返回值等,在很多特殊的场景下,比如在家里无法部署开发环境却需要检查线上程序具体问题,或者需要查问题的程序只有线上包没有源代码,可以使用Arthas进行在线诊断并处理,以后将会专门写一篇关于如何使用Arthas的文章。

如何在Debian 11安装CSF

CSF全称是Config Server Firewall,是一套可以轻松对防火墙策略和规则进行配置的防火墙软件,适合不熟悉linux防火墙的新手使用,本文介绍了如何安装和使用CSF,以增强linux的安全性。

我发现逐篇翻译看到的技术博文并不是那么高效,还是像阮老师那样把一周看到的有价值的文章收集起来,作为一个归档会更加有用。


微软发布了自己的linux版本:CBL-Mariner

根据github上的介绍,CBL-Mariner 是微软为了云架构,edge的产品和服务开发的内部linux发行版。CBL-Mariner的设计是为了云设备和服务提供持久化的平台,并使得微软可以跟上linux的更新脚本。这是微软对于linux技术投入的一部分,还包括SONiCAzure Sphere OSWindows Subsystem for Linux (WSL)

程序员才懂的幽默

一个摸鱼网站,着实不错,里面包含了大量得具有一定开发知识才能懂的段子,是纯英文的,摸鱼的同时也能顺便提升下英文水平(并不)。

权力的游戏指环王等奇幻故事里的地图

这篇文章介绍了奇幻小说中的地图,这些地图的创作倾注了作者的心血和巧思,可以给读者带来沉浸的阅读感受。原文中有更多的地图介绍。
`奥德赛`的扉页地图

13个程序员必看的博客网站

技术博客是程序员保持技术新鲜度非常重要的一个渠道,不仅仅是看其他的技术博客,自己维护一个博客也是很有必要。文章介绍了13个可以提升技术水平的博客网站,可以作为参考。
P.S.后面发现里面大部分网站的质量不高,要么得收费,要么更新频率低,要么没啥有价值的文章。。。

深入详解Node.js线程池

这篇文章介绍了使用BigQuery这个Node插件后出现的错误,应该有点深度,以我有限的Node.js知识和英文水平,并没有怎么看懂。
P.S.这个网站居然是收费的,一个月一篇免费博客。。。

声明

翻译自12 Best Practices for Writing Bash Scripts
翻译完发现这篇文章技术价值相当低。。。


Bash shell全称Bourne Again Shell,现在作为大部分的linux发行版本的默认shell。一个Bash脚本是一个包含多行shell命令的文件,用于执行特别的命令。如果你熟知bash脚本,那这篇文章就很适合你,在这篇文章中我写了12种bash脚本的最佳实践,可以增加bash脚本的效率并使其更易读。

注解

注解是一段清晰代码最基础的部分,用于定义或解释复杂代码的不同部分。写脚本的时候,你可以毫不费力的看懂很早之前你写过的代码。同样也能帮助你在一个大的项目组提高工作效率,帮助你理解一个函数或方法的真实用途。

使用函数

一个函数是一堆命令联合之后实现一个特定的任务,可以帮助工作流模块化并使得脚本可复用,消除重复的代码。这可以让你维护的代码更加清晰和可读。

1
2
3
4
5
6
7
#!/bin/bash

function check_root() {

echo "function has been called";

}

对引用变量使用双引号

使用双引号可以消除不必要的通配符,同时当引用变量包含分割字符和空格时可以将包含空格的单词进行分割。如下例子中,我们可以看出变量用不用双引号的区别。(译者:没有例子,作者估计漏了)

出现错误时终止脚本

有时候执行脚本的时候可能会出现一些错误。然而即使一个命令失败了,剩余的脚本也有可能继续运行,从而影响脚本中的其他命令。所以为了避免任何进一步的逻辑错误,我们需要加入set -o errexitset -e终止错误的命令。

1
2
3
4
5
#!/bin/bash

# Terminate the script on command fails

set -o errexit
阅读全文 »

原文链接


考古学家发现并开始破译罕见的中世纪符文

这个刻了字的骨头是最新发现的出土文物,同时也是近几十年首次在奥斯陆有此发现,

去年下半年,挪威的考古学家在几天内连续有了惊人的发现,在奥斯陆中世纪公园的不同区域出土了两件罕见的符文文物。

挪威国家遗产研究中心 (NIKU) 的Solveig ThorkildsenIngeborg Hornkjøl在不断的挖掘过程中发现了这些文物,其中一个骨头上雕刻了挪威语铭文,另一个的符文则同时由拉丁语和挪威文字写就。根据声明,符文骨是30多年来在挪威首都首次有这种发现。

团队在结束一天工作的时候,Thorkildsen发现了在地上的一个巨大骨头。她和同事开玩笑说:”看,这上面有符文!”

研究员捡起骨头然后把它翻过来,她震惊的发现在骨头的表面真的雕刻了14个符文。

“当时我的心脏狂跳,”Thorkildsen在声明中回忆说,”这次挖掘我心愿单的第一位就是找到符文。”NIKU介绍,符文骨可能是从马或牛的肋骨上取下的。至今为止在奥斯陆只发现了27块这样的骨头。

在Thorkildsen的发现几天后,Hornkjøl也有了同样令人振奋的发现。当时她站在一个用于灌满水的深坑中,她注意到一片木头被冲到了沟中。就像之前被翻过来的骨头一样,棍上的符文可追溯到中世纪。

这次同时发现两件刻字的文物,是及其罕见的,这将帮助研究者了解更多关于奥斯陆中世纪居民的信息。尽管文物还暂未在实验室中研究,考古学家已经推断这两个符文可追溯到公元1100年至1350年。

“每一次符文的发现都很重要,这将告诉我们更多关于中世纪的人民的喜好,且愿意将这些分享给周围的人,”来自奥斯陆大学的符文学专家Kristel Zilmer在一份声明中说道。”两份发现的符文提示了在那个时期人民的知识和兴趣的多样性。”

Zilmer初步研究发现在木板条符文的四面中,有三面刻着符文文字。文字包含拉丁语manus Domine or Domini,这可能是祷告的一部分,”Into your hands, O Lord, I commend my spirit. You have redeemed me, O Lord, O God of truth.”(学者告诉挪威科学,中世纪基督徒经常使用符文表达简单的祷告)

一个叫Bryngjerd的北欧人也在木棒中出现,也许描述了这个女人用了符文去表达她对上帝的奉献。

Thorkildsen发现的骨头上的符文的含义,Zilmer提供了两种理论解释。这个物品上带有北欧符文basmarþærbæin-这可能是一个名字或昵称,或者这是一个对于骨头本身的描述。

符文学者Karen Langsholt Holmqvist告诉挪威科学,符文是具有高度上下文相关含义的短文本。在中世纪的挪威,只有贵族可以读写,但也有相当一部分人熟知关于词汇,姓名和名句的符文。

12月份是中世纪公园的研究员们的大事件月。在Thorkildsen和Hornkjøl的发现前,NIKU的考古学家发掘出了一个中世纪的遗骸,戴着王冠,手持猎鹰。挪威科学当时发布报告时,一个三英尺长的文物发掘出来,来自动物的骨头,可能是用于刀具或工具。雕像可能是一种斯堪的纳维亚人对猎鹰的描绘,一种狩猎的鸟类用于对杀戮野生动物。


Medieval 中世纪
Runes 符文
unearthed 出土;发掘
inscribed 在…上写(词语、名字等);题;刻
only days apart 相隔几天
stunning 令人震惊的
heritage 遗产(指国家或社会长期形成的历史、传统和特色)
Norse 挪威语
inscription 碑文;铭文
stick with 紧随;和……呆在一起
ongoing 不间断的
excavations (对古物的)发掘;发掘现场;挖掘;开凿;挖土
wrapping up 总结
per a translation 根据翻译
trench 沟槽;沟;海沟;战壕;堑壕;渠;大洋沟
prone 有做…倾向的;俯卧的;易于遭受;有做(坏事)的倾向;易于遭受…的
dated to the medieval era 追溯到中世纪
fragments 碎片
runology 符文学
diversity 多样性
preliminary 初步的
manus 手
redeemed 补偿
The object bears the Norse inscription 该物品带有北欧符文
That runes are short pieces of text with highly context-dependent meanings 符文是具有高度上下文相关含义的短文本
a broad segment of the population 相当一部分人
falcon 猎鹰
Scandinavian depictions of falconry 斯堪的纳维亚人对猎鹰的描绘
figurine 雕像

原文链接

全都没玩过,甚至基本都没听过,看来确实是老了。。。


本文提到的产品完全是我们编辑的独立选择。如果你通过我们的链接购买游戏的话,GameSpot会得到一些佣金。

Metacritic评选的2021年度十佳PC游戏

PC游戏爱好者们今年有理由感到高兴,毕竟今年有很多的优秀游戏


今年也许是被刚上市的PS5和xbox series X|S统治的一年,但是PC游戏在2021年也比以往更加出色。诸多游戏平台充斥着独立制作和3A大作的标题,但是他们中哪一款是最出色的呢?通过GameSpot的兄弟网站Metacritci,我们优中选优,一致讨论出了即使批评家们也挑不出毛病的10款PC游戏。列出的结果包含了众多体裁,但是他们都有共同点,至少有一点是一样的:他们在2021年为你们贡献了最佳的游戏乐趣。

终焉之莉莉:骑士寂夜(Ender Lilies: Quietus of the Knights)


受到空洞骑士黑暗之魂的启发并将其二者融合,并伴随着大量的银河战士设计的影响,你将体验到的是一场美味的2D动作角色扮演游戏的盛宴,让你直到结尾也回味无穷。更棒的是,终焉之莉莉在以往那些老掉牙的探索和紧张战斗的套路中加入了一些现代化的改进,沿着路线攻克一些非常棘手的任务然后直接将你置于最强的boss之中,这个游戏中都将可能发生。

Meta评分: 86

死亡循环(Deathloop)


在土拨鼠日带着抢,身怀时间操控的能力,并且口吐芬芳,这听起来像是美好时光的秘方,而在死亡循环里,这些元素烹制出了2021年的最佳游戏之一。死亡循环主要侧重于其绝妙的时间循环的玩法,但这游戏的美妙之处也在于如何在每一次新的循环中奖励你新的知识,技巧,以及最终逃离暴力的黑礁大陆之后,产生的顿悟。

这很可能是开发商Arkane目前的最佳作品,一个无尽的沙盒,充满创造力和魅力,并且满溢着个人风格和充满自信的大屠杀。

Meta评分: 86

阅读全文 »

我这里针对的低版本linux指的是centos6。

问题起源

最近需要写一个页面,我前段时间一直在用nodejs开发,所以我就选择了react来写页面。在本机开发调试完成之后,部署到linux上出现问题,在运行npm install命令的时候出现如下报错:

1
2
3
4
5
6
7
8
9
npm WARN notsup Unsupported engine for react-scripts@5.0.0: wanted: {"node":">=14.0.0"} (current: {"node":"10.24.1","npm":"6.14.12"})
npm WARN notsup Not compatible with your version of node/npm: react-scripts@5.0.0
npm WARN notsup Unsupported engine for css-loader@6.5.1: wanted: {"node":">= 12.13.0"} (current: {"node":"10.24.1","npm":"6.14.12"})
npm WARN notsup Not compatible with your version of node/npm: css-loader@6.5.1
npm WARN notsup Unsupported engine for css-minimizer-webpack-plugin@3.3.1: wanted: {"node":">= 12.13.0"} (current: {"node":"10.24.1","npm":"6.14.12"})
npm WARN notsup Not compatible with your version of node/npm: css-minimizer-webpack-plugin@3.3.1
npm WARN notsup Unsupported engine for eslint@8.5.0: wanted: {"node":"^12.22.0 || ^14.17.0 || >=16.0.0"} (current: {"node":"10.24.1","npm":"6.14.12"})
npm WARN notsup Not compatible with your version of node/npm: eslint@8.5.0
.....

显然,根据提示是因为node版本太低导致,那首先想到的必然就是升级node版本。

尝试升级node版本失败,gcc版本过低

升级node版本有几种办法:

  • 通过下载官网的二进制包,然后解压缩到目录,再通过ln指令进行node版本的关联。
  • 第二种方法比较简单,安装node的一个版本管理工具,叫n,然后运行如下指令就可以完成安装:
    1
    2
    npm install -g n
    n node版本号
    阅读全文 »

原文链接

吐槽一下,这十佳电影看着满满都是政治正确的味道,Passing这部电影简直buff叠满,黑白片,双女主,关于美国梦和黑人白人之间的冲突,满脸写着”我是冲着奥斯卡来的”。


2021十佳电影

如果说2020年对于影迷来说是一个漫长黑暗的冬天(当然也有一些优秀的影片,但是不得不在家观影也是一个打击),2021就是一个生机勃勃,欢声笑语的春天。不仅仅是普通意义的春天,也是一个充满了斯特拉文斯基风格的春天,在祥和齐声的交响乐中绽放在大地上的番红花,雨滴阵阵落满了泥土,树木抽出了嫩芽。这么说的一部分原因很现实,也在预料之内:相当数量的今年的最佳影片早在2020年就已完成,但是推迟了,直到它们可以在影院上映。在黑暗的几个月过去后,这个值得欢庆的季节里绽放的曙光依然可以看作精神的慰藉。在本文的结尾,请参考这十部今年最好的电影(以及提名影片)作为你观影的选项。我们都值得这一切。

  • 10.Drive My Car

Ryusuke Hamaguchi的三小时的流畅而又华丽的剧本(故事改编自Haruki Murakami的短篇小说),讲述了一个来自东京,经历了丧偶的演员和戏剧导演(Hidetoshi Nishijima),在广岛找了份工作,制作契柯夫的《万尼亚舅舅》。一个来自乡下(三浦店)的年轻女人被雇佣当他的司机;他们慢慢建立了友情,同时也帮助他分辨出他究竟迷失在哪里。Hamaguchi编织了一个关于失去和原谅,充满了光辉的故事,无论你有多么疲惫,一句轻轻的鼓励也能推动你在世界上继续前行。

  • 9.The Tragedy of Macbeth

这个故事你可能已经看过几百次了。但是Joel Coen用令人战栗的黑白色调,以及Frances McDormand和Denzel Washington饰演的狡诈,奸险的苏格兰人,犹如魔咒般吸引人,他们共同对该经典进行了难以置信的表达,彷佛置身于400年前,你作为第一个观众看到这个戏剧的首次呈现。今时今日,犹如往昔,这个故事冻彻骨髓。

阅读全文 »

原文链接

Chinese Rover Spots Weird, Large ‘Cube’ on the Moon

中国航天器在月球发现了诡异巨大的”方块”

The geometric lunar feature dubbed a ‘mystery hut’ has stumped scientists, who say they plan to take a closer look

这个呈几何状的月球物体被戏称为”神秘小屋”,让科学家们感到困惑,他们计划靠近点看看


The rover will spend two to three lunar days, which is about two to three months time on Earth, traversing the lunar landscape to take a closer look at the object. CNSA/Our Space/Gizmodo
航天器将花费两到三个月球日,相当于地球上两到三个月的时间,通过月球表面来更近的观察这个物体。CNSA/Our Space/Gizmodo

An intriguing cube-shaped object spotted on the far side of the moon has attracted the attention of scientists.
一个有趣的方块形状物体,在月球的另一端被发现,这引起了科学家的注意。

China’s Yutu 2 rover captured images of the mystery structure from around 260 feet away while navigating across the Von Kármán crater in the South Pole-Aitken Basin on the moon, reports Popular Science’s Margo Milanowski. Chinese scientists have already rerouted the rover to take a closer look, but it will take a few months for Yutu 2 to reach the bizarre lunar feature.
《流行科学》的Margo Milanowski报道,中国的月兔2号航天器在月球的北部Pole-Aitken盆地,正在穿越Von Kármán坑时,拍摄到一张260英尺外的神秘结构的物体。中国的科学家已经调整航天器的方向以更近的观察,但是这将花费月兔2号几个月的时间去靠近这个奇特的月球物体。

The shape was spotted on the horizon in November during the mission’s 36th lunar day, according to a Yutu 2 diary published by Our Space, a Chinese language science outreach channel affiliated with the China National Space Administration. Our Space first described the object in a post last week, temporarily dubbing it a “mystery hut” (神秘小屋/shenmi xiaowu).
根据《我们的太空》的月兔2号每日报告(这是一家隶属于中国国家航天局的对外中文平台),这个几何体在地平线处发现,正值12月份,执行任务的第36个月球日。《我们的太空》在上周首次描述这个物体,将其戏称为是一个”神秘小屋”。

阅读全文 »

声明

翻译自Andrew Ayer博客
翻译水平不佳,自己学习使用

现在可以使用SSH密钥给任意数据加密

你知道吗,你可以使用ssh-keygen命令加密和验证任意数据,比如文件和发行软件?尽管这个特性并不是特别新(在2019年随着OpenSSH 8.0发布),依然很少有人知道。
这就有点尴尬,因为这个功能非常有用而且可以作为PGP的有效替换用以加密数据。如果你现在在用PGP加密数据,你可以考虑转到SSH签名上。

以下是我喜欢用SSH签名的原因:

  • 不是PGP。 多年来,安全专家已经对PGP做出了警告,包括其最重要的组件GnuPG/GPG。
    PGP太复杂了,用户体验非常糟糕,而且充斥着门槛很高的粗糙老旧的密码学原理,
  • SSH无处不在,而且用户早就有SSH密钥了。 如果你用的是 Debian Bullseye 或者 Ubuntu 20.04以及更新的版本,你已经有了足够的SSH安装版本。如果你有用Github,
    或者任何其他的借助SSH命令来验证的服务,你也早就有了一个SSH密钥用于创建签名了。这就是为什么我对SSH签名更热衷,而不是其他PGP的替代品,比如signify 或者
    minisign。后两者很优秀,但是需要你安装新的软件和创建一个新的密钥,这就会阻碍更大范围的兼容性。
  • SSH密钥很容易分配。 SSH公钥只用一行代码就可以轻松到处复制。你不需要网络白名单或者费心去配置密钥的”信任等级”。Github作为一个密钥分配服务早就演示过,比起原先的
    PGP密钥服务器更加简易也更加安全。你可以通过访问网页https://github.com/USERNAME.keys去检索任意用户的SSH公钥。(比如,我的公钥在[https://github.com/AGWA.keys](https://github.com/AGWA.keys))
    (这个例子可能不适用于所有的情况,毕竟Github在这里作为一个可信任的第三方,而且你也必须相信他们不会对大众的公钥作假。但是依赖于Github这样的专业安全团队作为可信赖的第三方,应该比几乎不可能用到的PGP的网络白名单更好。
    在实践中,如果你曾经想搞清楚如何审核透明度日志,那第三方的公钥的透明度需要考虑进去。)
  • SSH有可选的轻量级证书。 SSH证书不是必需的(而且大部分人也用不到),但是证书可以让你的操作更轻松,SSH有一套比X.509简单很多的轻量级证书系统。这使得SSH签名和S/MIME一样是一个好的选项。

你现在可以使用SSH给Git提交和标签加签名

给Git的提交和标签加签名可以帮助你确认你的的仓库在被别人使用的时候,代码未曾被篡改。但是,你必须用PGP或者S/MIME来做到这件事,而我个人从2018年PGP密钥过期后就没在这件事上被困扰过。
马上在Git 2.34这些都会改变了,这个版本支持了SSH签名。(TODO 咋翻译都不对。。)

文件签名

像这样直接对一个文件进行签名:

1
ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n file file_to_sign

需要更改的参数如下:

  • ~/.ssh/id_ed25519是你私钥的路径。例子里的是你的SSH Ed25519私钥的标准路径。如果你有一个RSA密钥,改为使用id_rsa。

  • file 参数是”命名空间”,用来描述签名的目的,对于一般文件的签名,SSH将其定义为file,邮件的签名定义为email,Git则使用git作为签名。
    如果你的签名用于其他目的,比如一个一般协议,你必须指明你自己的命名空间。这样,你可以避免来自一个单一协议信息的合法签名被移除后,或者附属在不同的协议信息,发起的跨协议攻击。
    如果对于协议签名不使用特定的命名空间,那第一个协议的签名就有可能被视作第二个签名的协议,从而被认为是合法的。
    命名空间可以是随机字符。为了保证全局的命名空间的唯一性,SSH推荐对于你自己的签名使用email作为命名空间的一部分。比如,我会使用类似于protocolname-v1@agwa.name的名字作为命名空间。

  • file_to_sign 是要被签名的文件的路径。

签名会写入一个叫做file_to_sign.sig的新文件中,格式如下:

1
2
3
4
5
6
-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg2rirQQddpzEzOZwbtM0LUMmlLG
krl2EkDq4CVn/Hw7sAAAAEZmlsZQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUx
OQAAAEDyjWPjmOdG8HJ8gh1CbM8WDDWoGfm+TTd8Qa8eua9Bt5Cc+43S24i/JqVWmk98qV
YXoQmOYL4bY8t/q7cSNeMH
-----END SSH SIGNATURE-----

如果你指明了文件名,那文件签名会从该标准输入并从该标准写出。

签名验证

签名验证稍微更复杂点。首先你需要创建一个被允许的签名者文件,该文件将邮件地址映射到公钥,类似于这样:

1
2
3
alice@example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINq4q0EHXacxMzmcG7TNC1DJpSxpK5dhJA6uAlZ/x8O7
alice@example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfHGCK5jjI/Oib4vRBLB9rG30A8y/Br9U75rfAYsitwFPFfl/CaTAvfRlW1lIBqOCshLWxGsN+PFiJCiCWzpW4iILkD5X5KcBBYHTq1ojYXb70BrQXQ+QBDcGxqQjcOp/uTq1D9Z82mYq/usI5wdz6f1KNyqM0J6ZwRXMu6u7NZaAwmY7j1fV4DRiYdmIfUDIyEdqX4a1Gan+EMSanVUYDcNmeBURqmTkkOPYSg8g5xYgcXBMOZ+V0ZUjreV9paKraUD/mVDlZbb/VyWhJGT4FLMNXHU6UHC2FFgqANMUKIlL4vhqc23MoygKbfF3HgNB6BNfv3s+GYlaQ3+66jc5j
bob@example.net ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBgQuuEvhUXerOTIZ2zoOx60M/HHJ/tcHnD84ZvTiX5b

一旦你拥有了你的被允许的签名文件,验证的步骤如下:

1
ssh-keygen -Y verify -f allowed_signers -I alice@example.com -n file -s file_to_verify.sig < file_to_verify

你需要修改如下参数:

  • allowed_signers 是被允许的签名者文件的路径。
  • alice@example.com 是对文件加签名的用户邮件地址。该邮件地址会在允许的签名者文件里进行查找到对应的公钥。
  • file 是”命名空间”,该参数必须匹配前文描述的签名中的命名空间。
  • file_to_verify.sig 是签名文件的路径。
  • file_to_verify 是被验证的文件的路径。注意该文件是从标准读入的。在前面的命令中,<这个shell操作符用于重定向标准到该文件。

如果签名是有效的,命令行会返回状态0并打印如下信息:

1
Good "file" signature for alice@example.com with ED25519 key SHA256:ZGa8RztddW4kE2XKPPsP9ZYC7JnMObs6yZzyxg8xZSk

否则,命令行会返回非0状态并打印错误信息。

SSH密钥的复用安全吗?

简单来说:安全。

对一个不同协议总是要小心的对密钥进行复用。如果不注意的话,有可能导致跨协议攻击的风险。比如,当一个Git签名信息的结构和SSH协议信息的结构相似,攻击者就可以通过SSH副本挪用签名,并伪造一个Git的人工提交。

幸运的是,SSH协议信息的结构和ssh-keygen签名信息的结构并不相似,因此并没有这方面风险的担忧。

为了证明这点,我们可以参考这篇RFC 4252 section 7,阐明了SSH密钥是如何在传统用途上通过SSH验证用户登录服务器。
RFC指出输入的签名语法拥有如下结构:

1
2
3
4
5
6
7
8
string    session identifier
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication

第一个字段是会话标识,是个字符串。在SSH协议中,字符串的前缀由一个32位字符构成。会话标识是一个hash值。除非hash值很短,否则一般的上述签名的前三位字符都会是0。

同时,PROTOCOL.sshsig分发OpenSSH仓库,表明了如何通过ssh-keygen-generated签名使用SSH密钥。以下是输入的签名语法的结构:

1
2
3
4
5
6
7
#define MAGIC_PREAMBLE "SSHSIG"

byte[6] MAGIC_PREAMBLE
string namespace
string reserved
string hash_algorithm
string H(message)

在这里,头三个字节是SSH,来自magic preamble(直译是魔法序言?)。SSH协议签名输入的头三个字节之后就开始和ssh-keygen签名输入不一样,SSH客户端和ssh-keygen不会生成同样的签名。因此,在这里不会有跨协议攻击的风险,我也有绝对的信心使用现存的SSH密钥,通过ssh-keygen来对信息加密。

0%