这两年

不怀好意的回看了两年,发现每年都有黑天鹅事件让人措手不及。

两年前,也许可以六亲不认的一直向前看,如今也终于到了不得不会瞻前顾后的阶段。

这两年,探索的路少了,很多判断却变得没有那么绝对了。特别想跟自己沟通的还是希望自己能继续保持的平和心态,以及永远热泪盈眶的生活态度

几天前,掏出了抽屉里珍藏了两年的可乐,并在罐底的2019旁边写下了2021,然后又把可乐放了回去——而两年前写下2019的时候,设想的是把它喝下去。从窗户旁的工位看透这明媚的阳春三月,格外耀眼。只是如今想来,当时也不过如此,当下也不过如此。不是没有了波澜,只是时间要承载的还能更多。

捡垃圾DIY高性能黑群晖家庭NAS

虽然网络重重受阻,但一直是 Google Photo 的忠实用户,原因有很多,比如智能相册,每到一个地方游玩回来,自动生成一个相册;比如智能滤镜和历史推荐,每每在不经意间震撼到你,流下时间的眼泪。当然,最重要的原因应该是无限容量的高质量存储。

然而,这个优势将在2021年6月1日终止:

Starting June 1, 2021, any new photos and videos you upload will count toward the free 15 GB of storage that comes with every Google Account or the additional storage you’ve purchased as a Google One member. Your Google Account storage is shared across Drive, Gmail and Photos. This change also allows us to keep pace with the growing demand for storage. And, as always, we uphold our commitment to not use information in Google Photos for advertising purposes. We know this is a big shift and may come as a surprise, so we wanted to let you know well in advance and give you resources to make this easier.

也就是后续新长传的照片和视频将不再享受无限容量,每月100GB的价格是1.99刀(很良心的价格)。看到这个消息的时候,虽然有失望,但更多的还是惋惜和感谢。如果免费存储这条路连谷歌生态中也无法实现,那应该也不会有第二家公司能支撑起这种商业模式,感谢对过往历史的忠实记录。

付费的价格是并不高,但是考虑到家里父母手机相册备份问题,索性这次就自建NAS把家人的数据备份问题都解决。

黑群晖方案配置

因为目的是备份照片,因此需要在手机上有友好的app支持。这样的话FreeNAS和OMV就是被排除在外了,几乎只有群晖一个选项。然而,白群晖的性价比实在让人提不起兴趣。正好手痒,捡了一些洋垃圾DIY的一个黑群晖,花了不到一半的价格,性能确是918+性能的两倍以上:

准系统: ThinkPad P300, ¥390
CPU: 奔腾G220, ¥40
内存: 金士顿4G, ¥56
硬盘: 希捷酷鹰4T, ¥488
系统盘: 酷豆16G, ¥24
总计:¥998

为什么选了一个 SFF 4代酷睿的准系统?

牙膏厂酷睿4~7代基本没啥区别,但是4代准系统和内存便宜。ThinkPad P300算是这里面比较贵的,主要原因是以前是ThinkPad的脑残粉,P300颜值要高出其他品牌一个level:

为了颜值,除了牺牲价格,还有就是扩展性。P300算是光驱位替换,只能塞下两块3.5+一块2.5硬盘。但对于我来说,一共也就6部手机需要备份,一共不到2T,一块硬盘就足够了,扩展性的短板也就不是问题了。

如果极致追求性价比,可以考虑惠普z230,300左右可以拿下,最多可以扩展3块3.5硬盘。

为什么是标压CPU?

NAS全天候开机,需要考虑节能,这并没有错。选择标压CPU也没有错。因为CPU的TDP只是一个参考,低负载运行的时候,主要是CPU的核数影响功率,G3220是一颗双核CPU,待机功耗低,而在转码等需要性能的场景有可以提供足够的性能,CPU MARK得分是918+的两倍还多,而且核显支持硬解。实际测试功耗只有20w:

为什么选择酷鹰,而不是烂大街的酷狼?

其实主要是非叠瓦盘就可以了,酷狼酷鹰只是一个渠道概念,产品没什么区别。价格上酷鹰便宜一大截。不过最近日立的监控盘价格只需要300多,也可以看看。

黑群晖如何装?

网上教程太多了,随便找一个吧。

如何开启公网访问NAS?

因为是黑群晖,又不想洗白,那么外网访问可以通过DDNS+宽带公网IP了。

只有一块硬盘,那就是没有用RAID喽?

是的。我对这台NAS的职能定义很简单,就是备份。容灾的话,RAID是可能的方案之一,但是对于家庭用户却是一个挺鸡肋的方案。因此,我选择定期用移动硬盘拷贝备份NAS硬盘做灾备。

网络只有一个千兆网卡?

是的。只有一个机械硬盘,又没有SSD缓存,一个千兆网卡足够了。如果是当做视频剪辑NAS使用,系统建议就使用FreeNAS, 然后通过PCIE插槽扩展万兆网卡,内存至少32G.

1024搬砖之IG密码加密方案分析

10.24本来是普通的日子,但却有机会让你很容易的区分的两种人:程序猿与其他。

正好周六,于是把之前 side project 中的一个临时方案修改一下。其中一个关键问题点是:用 go 生成 Instagram 登录时需要用到的加密密码。

C# 版本代码如下

扫了一下整体结构,发现IG的这段加密设计还是很好的体现了大厂典范:

  1. 密码加密使用到了 aes-256-gcm, 不是野生程序员上来就是base64或者来一个自欺欺人的哈希函数(MD5, SHA1等)。这两者本身不应该一起提,因为本身是用途完全不一样的东西,只是国内看过很多方案是后者,有时候还觉得自己加了salt更安全。AES结合GCM在解决数据加密问题的同时,也解决是数据完整性校验的问题。此外,加密操作中引入time作为附加数据,因此也可以校验数据的时效性,防止重放攻击。
  2. AES是一种对称加密,因此涉及的密钥分发的问题。上述方案中,使用了SealedPublicKeyBox 这种常用且规范的源于。即通过接收者的公钥来解密AES的对称密钥,得到密钥的密文。而这个密钥密文只有接收者使用自己的私钥才能解密。
  3. 从私钥密钥去中心化以及管理维护成本出发,应该是同时启用了多对公私钥对(可通过keyId识别)。
  4. 密文bytes构造上采用经典简洁的length.content设计。
  5. 最终构造的 enc_password 格式中包含了平台、版本、时间戳、密文。如果你也设计过密码加密的方案,你应该能看到这几个要素没有一点废话,基本就是教科书的标准格式示范。调研了一圈,发现的唯一业务上的槽点是版本为某个特定值时,其实是允许传输明文密码的。这从语义上来说是矛盾的,推测是从前向兼容的一种妥协。
  6. golang中可以通过 NewGCM 实现 aes-256-gcm, 但是认证标签(authentication tag) 没有单独输出,是append在密文之后的。因此可以通过 cipherText[len(cipherText)-16:] 获取。
  7. golang中没有 SealedPublicKeyBox 原语。可以用 package golang.org/x/crypto/nacl/box 中的 SealAnonymous 代替。

其实密码加密方案有很多基本的概念和原则,国外大厂也有很多规范的设计。只要不是一开始就想当然,其实是能找到或者设计出一个符合业务需求且安全高效的加密方案的。

特殊的一天,在老家楼上分析了一段有意思的代码,完整了方案的重构,还开着遥控车在农村撒欢越野。 What a beautiful day!