上GitHub看关于GPG Key的说明时,发现我用的secp256k1并不受支持(谁叫我当初特立独行的来着,终究是自己承担一切)。本来是挺简单的事,只要用主密钥再签署一个 subkey 即可。
然而主密钥好久没用了。我把主密钥(masterkey)的密码(passphrase)用其中一个 subkey 加密了放在别的地方。解密成功,复制,粘贴,失败。
这可完了,然后再拿以前用过的密码,还有其他什么乱七八糟的密码都试了一下,无果。
祸不单行的是,用于加密的 subkey 的备份密码也丢失了,这意味者它的私钥现在只存在于近在眼前,远在天边的 YubiKey 中了,我可以随便用,但是没法导出,没法备份,如果继续用风险可就大了。
于是生成了一个新的 PGP Key,把以前的替换了。按照规范是该生成个 revoke 的,但是主密钥已经丢了啊,另外想到这事的时候我已经把用于签名的 subkey 也删除了... 幸亏目前这个没多大用,更换一下成本不大。
另外,我建议这样保存备份的密码。如果看得懂这是怎么用的,那就可以考虑放心用它吧。这是我经过之前的教训改良的代码,应该没多大问题。 之前的 subkey 就是这么备份的,但是我不知道哪一题回答错了。 建议题目不少于40道,最好是只有自己知道,并且确信在使用周期内不会生疏的题目。
#!/bin/python3
import hashlib
import re
import base64
ans = []
def fmt(patt:str):
if not re.match(f'^{patt}$', ans[-1]):
raise ValueError('Format error at ans[{}], "{}"'.format(len(ans), ans[-1]))
# Q0: when is your birthday?
ans.append('2001.10.5') # 生成完之后,把里面的答案删掉,就可以当密码备份使用了.
fmt(r'\d{4}\.\d{1,2}\.\d{1,2}')
# Q1: what is the best programming language in the world?
ans.append('php')
fmt(r'.+')
givenCode = 'ckcd'
result = ';'.join(ans).encode()
result = hashlib.pbkdf2_hmac('sha256', result, b'this is a salt', 10**6)
hashStr = base64.b64encode(result).decode().replace('=', '')
checkCode = hashStr[-4:]
passphr = hashStr[:32]
if checkCode == givenCode:
print(f'CheckCode match: "{checkCode}"')
print(f'Passphrase is: "{passphr}"')
else:
print(f'CheckCode error: "{checkCode}"')
print(f'Given check code is "{givenCode}"')