产业气象站 | Linux 中国,国王的秘密:如何保护你的主密码


产业气象站 | Linux 中国,国王的秘密:如何保护你的主密码
文章图片
导读:这种使用Python和Shamir秘密共享的独特算法可以保护你的主密码 , 可以有效避免黑客窃取和自己不经意忘记引发的风险和不便 。
本文字数:5607 , 阅读时长大约:7分钟
https://linux.cn/article-12474-1.html作者:MosheZadka译者:SilentDawn
很多人使用密码管理器来保密存储自己在用的各种密码 。 密码管理器的关键环节之一是主密码 , 主密码保护着所有其它密码 。 这种情况下 , 主密码本身就是风险所在 。 任何知道你的主密码的人 , 都可以视你的密码保护若无物 , 畅行无阻 。 自然而然 , 为了保证主密码的安全性 , 你会选用很难想到的密码 , 把它牢记在脑子里 , 并做你应该做的事情 。
但是万一主密码泄露了或者忘记了 , 后果是什么?也许你去了个心仪的岛上旅行上个把月 , 没有现代技术覆盖 , 在开心戏水之后享用美味菠萝的时刻 , 突然记不清自己的密码是什么了 。 是“山巅一寺一壶酒”?还是“一去二三里 , 烟村四五家”?反正当时选密码的时候感觉浑身都是机灵 , 现在则后悔当初何必作茧自缚 。
产业气象站 | Linux 中国,国王的秘密:如何保护你的主密码
文章图片
(,)
当然 , 你不会把自己的主密码告诉其它任何人 , 因为这是密码管理的首要原则 。 有没有其它变通的办法 , 免除这种难以承受的密码之重?
试试(Shamir"sSecretSharing) , 这是一种可以将保密内容进行分块保存 , 且只能将片段拼合才能恢复保密内容的算法 。
先分别通过一个古代的和一个现代的故事 , 看看Shamir秘密共享算法究竟是怎么回事吧 。
这些故事的隐含前提是你对密码学有起码的了解 , 必要的话 , 你可以先温习一下.
一个古代关于加解密的故事
古代某国 , 国王有个大秘密 , 很大很大的秘密:
defint_from_bytes(s):
acc=0
forbins:
acc=acc*256
acc+=b
returnacc
secret=int_from_bytes("terriblesecret".encode("utf-8"))
大到连他自己的孩子都不能轻易信任 。 他有五个子女 , 但他知道前路危机重重 。 他的孩子需要在他百年之后用这个秘密来保卫国家 , 而国王又不能忍受自己的孩子在他们还记得自己的时候就知道这些秘密 , 尤其是这种状态可能要持续几十年 。
所以 , 国王动用大力魔术 , 将这个秘密分为了五个部分 。 他知道 , 可能有一两个孩子不会遵从他的遗嘱 , 但绝对不会同时有三个或三个以上会这样:
frommodimportMod
fromosimporturandom
国王精通和随机魔法 , 当然 , 对他来说 , 使用巨蟒分割这个秘密也是小菜一碟 。
第一步是选择一个大质数——第13个(2**521-1) , 他让人把这个数铸造在巨鼎上 , 摆放在大殿上:
P=2**521-1
但这不是要保密的秘密:这只是公开数据 。
国王知道 , 如果P是一个质数 , 用P对数字取模 , 就形成了一个数学:在场中可以自由进行加、减、乘、除运算 。 当然 , 做除法运算时 , 除数不能为0 。
国王日理万机 , 方便起见 , 他在做模运算时使用了PyPI中的模块 , 这个模块实现了各种模数运算算法 。
他确认过 , 自己的秘密比P要短:
secret&ltP
TRUE
将秘密转换为P的模 , modP:
secret=mod.Mod(secret,P)
为了使任意三个孩子掌握的片段就可以重建这个秘密 , 他还得生成另外两个部分 , 并混杂到一起:
polynomial=[secret]
foriinrange(2):
polynomial.append(Mod(int_from_bytes(urandom(16)),P))
len(polynomial)
3
下一步就是在随机选择的点上计算某的值 , 即计算polynomial[0]+polynomial[1]*x+polynomial[2]*x**2... 。


推荐阅读