前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何保护你的主密码

如何保护你的主密码

作者头像
用户1880875
修改于 2021-09-15 09:33:59
修改于 2021-09-15 09:33:59
44500
代码可运行
举报
运行总次数:0
代码可运行

很多人使用密码管理器来保密存储自己在用的各种密码。密码管理器的关键环节之一是主密码,主密码保护着所有其它密码。这种情况下,主密码本身就是风险所在。任何知道你的主密码的人,都可以视你的密码保护若无物,畅行无阻。自然而然,为了保证主密码的安全性,你会选用很难想到的密码,把它牢记在脑子里,并做所有其他你应该做的事情。

但是万一主密码泄露了或者忘记了,后果是什么?也许你去了个心仪的岛上旅行上个把月,没有现代技术覆盖,在开心戏水之后享用美味菠萝的时刻,突然记不清自己的密码是什么了。是“山巅一寺一壶酒”?还是“一去二三里,烟村四五家”?反正当时选密码的时候感觉浑身都是机灵,现在则后悔当初何必作茧自缚。

当然,你不会把自己的主密码告诉其它任何人,因为这是密码管理的首要原则。有没有其它变通的办法,免除这种难以承受的密码之重?

试试 Shamir 秘密共享算法(Shamir's Secret Sharing),这是一种可以将保密内容进行分块保存,且只能将片段拼合才能恢复保密内容的算法。

先分别通过一个古代的和一个现代的故事,看看 Shamir 秘密共享算法究竟是怎么回事吧。

这些故事的隐含前提是你对密码学有起码的了解,必要的话,你可以先温习一下 密码学与公钥基础设施引论.

一个古代关于加解密的故事

古代某国,国王有个大秘密,很大很大的秘密:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def int_from_bytes(s):
    acc = 0
    for b in s:
        acc = acc * 256
        acc += b
    return acc

secret = int_from_bytes("terrible secret".encode("utf-8"))

大到连他自己的孩子都不能轻易信任。他有五个子女,但他知道前路危机重重。他的孩子需要在他百年之后用这个秘密来保卫国家,而国王又不能忍受自己的孩子在他们还记得自己的时候就知道这些秘密,尤其是这种状态可能要持续几十年。

所以,国王动用大力魔术,将这个秘密分为了五个部分。他知道,可能有一两个孩子不会遵从他的遗嘱,但绝对不会同时有三个或三个以上会这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mod import Mod
from os import urandom

国王精通 有限域随机 魔法,当然,对他来说,使用巨蟒分割这个秘密也是小菜一碟。

第一步是选择一个大质数——第 13 个 梅森质数2**521 - 1),他让人把这个数铸造在巨鼎上,摆放在大殿上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
P = 2**521 - 1

但这不是要保密的秘密:这只是 公开数据

国王知道,如果 P 是一个质数,用 P 对数字取模,就形成了一个数学 :在场中可以自由进行加、减、乘、除运算。当然,做除法运算时,除数不能为 0。

国王日理万机,方便起见,他在做模运算时使用了 PyPI 中的 mod 模块,这个模块实现了各种模数运算算法。

他确认过,自己的秘密比 P 要短:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
secret < P
TRUE

将秘密转换为 P 的模,mod P

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
secret = mod.Mod(secret, P)

为了使任意三个孩子掌握的片段就可以重建这个秘密,他还得生成另外两个部分,并混杂到一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
polynomial = [secret]
for i in range(2):
    polynomial.append(Mod(int_from_bytes(urandom(16)), P))
len(polynomial)
3

下一步就是在随机选择的点上计算某 多项式 的值,即计算 polynomial[0] + polynomial[1]*x + polynomial[2]*x**2 ...

虽然有第三方模块可以计算多项式的值,但那并不是针对有限域内的运算的,所以,国王还得亲自操刀,写出计算多项式的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def evaluate(coefficients, x):
    acc = 0
    power = 1
    for c in coefficients:
        acc += c * power
        power *= x
    return acc

再下一步,国王选择五个不同的点,计算多项式的值,并分别交给五个孩子,让他们各自保存一份:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shards = {}
for i in range(5):
    x = Mod(int_from_bytes(urandom(16)), P)
    y = evaluate(polynomial, x)
    shards[i] = (x, y)

正如国王所虑,不是每个孩子都正直守信。其中有两个孩子,在他尸骨未寒的时候,就想从自己掌握的秘密片段中窥出些什么,但穷极所能,终无所获。另外三个孩子听说了这个事,合力将这两人永远驱逐:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
del shards[2]
del shards[3]

二十年弹指一挥间,奉先王遗命,三个孩子将合力恢复出先王的大秘密。他们将各自的秘密片段拼合在一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
retrieved = list(shards.values())

然后是 40 天没日没夜的苦干。这是个大工程,他们虽然都懂些 Python,但都不如前国王精通。

最终,揭示秘密的时刻到了。

用于反算秘密的代码基于 拉格朗日差值,它利用多项式在 n 个非 0 位置的值,来计算其在 0 处的值。前面的 n 指的是多项式的阶数。这个过程的原理是,可以为一个多项式找到一个显示方程,使其满足:其在 t[0] 处的值是 1,在 i 不为 0 的时候,其在 t[i] 处的值是 0。因多项式值的计算属于线性运算,需要计算 这些 多项式各自的值,并使用多项式的值进行插值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from functools import reduce
from operator import mul

def retrieve_original(secrets):
    x_s = [s[0] for s in secrets]
    acc = Mod(0, P)
    for i in range(len(secrets)):
        others = list(x_s)
        cur = others.pop(i)
        factor = Mod(1, P)
        for el in others:
            factor *= el * (el - cur).inverse()
        acc += factor * secrets[i][1]
    return acc

这代码是在太复杂了,40 天能算出结果已经够快了。雪上加霜的是,他们只能利用五个秘密片段中的三个来完成这个运算,这让他们万分紧张:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
retrieved_secret = retrieve_original(retrieved)

后事如何?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
retrieved_secret == secret
TRUE

数学这个魔术的优美之处就在于它每一次都是那么靠谱,无一例外。国王的孩子们,曾经的孩童,而今已是壮年,足以理解先王的初衷,并以先王的锦囊妙计保卫了国家,并继之以繁荣昌盛!

关于 Shamir 秘密共享算法的现代故事

现代,很多人都对类似的大秘密苦不堪言:密码管理器的主密码!几乎没有谁能有足够信任的人去完全托付自己最深的秘密,好消息是,找到至少有三个不会串通起来搞鬼的五人组不是个太困难的事。

同样是在现代,比较幸运的是,我们不必再像国王那样自己动手分割要守护的秘密。拜现代 开源 技术所赐,这都可以使用现成的软件完成。

假设你有五个不敢完全信任,但还可以有点信任的人:张三、李四、王五、赵六和钱大麻子。

安装并运行 ssss 分割密钥:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ echo 'long legs travel fast' | ssss-split -t 3 -n 5
Generating shares using a (3,5) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: Using a 168 bit security level.
1-797842b76d80771f04972feb31c66f3927e7183609
2-947925f2fbc23dc9bca950ef613da7a4e42dc1c296
3-14647bdfc4e6596e0dbb0aa6ab839b195c9d15906d
4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
5-17da24ad63f7b704baed220839abb215f97d95f4f8

这确实是个非常牛的主密码:long legs travel fast,绝不能把它完整的托付给任何人!那就把五个片段分别交给还比较可靠的伙伴,张三、李四、王五、赵六和钱大麻子。

  • 1 给张三。
  • 2 给李四。
  • 3 给王五。
  • 4 给赵六。
  • 5 给钱大麻子。

然后,你开启你的惬意之旅,整整一个月,流连于海边温暖的沙滩,整整一个月,没碰过任何电子设备。没用多久,把自己的主密码忘到了九霄云外。

李四和王五也在和你一起旅行,你托付给他们保管的密钥片段保存的好好的,在他们各自的密码管理器中,但不幸的是,他们和你一样,也忘了自己的 主密码

没关系。

联系张三,他保管的密钥片段是 1-797842b76d80771f04972feb31c66f3927e7183609;赵六,一直替你的班,很高兴你能尽快重返岗位,把自己掌握的片段给了你,4-97c77a805cd3d3a30bff7841f3158ea841cd41a611;钱大麻子,收到你给的跑腿费才将自己保管的片段翻出来发给你,5-17da24ad63f7b704baed220839abb215f97d95f4f8

有了这三个密钥片段,运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ssss-combine -t 3
Enter 3 shares separated by newlines:
Share [1/3]: 1-797842b76d80771f04972feb31c66f3927e7183609
Share [2/3]: 4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
Share [3/3]: 5-17da24ad63f7b704baed220839abb215f97d95f4f8
Resulting secret: long legs travel fast

就这么简单,有了 开源 技术加持,你也可以活的像国王一样滋润!

自己的安全不是自己一个人的事

密码管理是当今网络生活必备技能,当然要选择复杂的密码,来保证安全性,但这不是全部。来用 Shamir 秘密共享算法,和他人共同安全的存储你的密码吧。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
密码学[2]:群 环 域
一个集合 G 和该集合上的某种二元运算。群 G 中的两个元素通过某种二元运算可得到该群中的另一个元素。群要满足一些性质,比如交换律、结合律、元素存在逆等。
谛听
2023/10/18
7850
详解零知识证明的四大基础技术,如何与以太坊发生反应
雷锋网按:原文标题为《zkSNARKs in a nutshell》,作者是以太坊智能合约语言Solidity的发明人Christian Reitwiessner。译者杨文涛,授权转载自作者知乎专栏。 摘要: zkSNARKs(zero-knowledge succint non-interactive arguments of knowledge)的成功实现让我们印象深刻,因为你可以在不执行,甚至在不知道执行具体内容的情况下确定某个计算的结果是否正确——而你唯一知道的信息就是它正确地完成了。但是不幸的是,
企鹅号小编
2018/01/22
1.6K0
详解零知识证明的四大基础技术,如何与以太坊发生反应
2023年西湖论剑
图片 前言 图片 WP WEB 扭转乾坤 大写一个F即可 图片 得到flag DASCTF{407a13a21a6b85b1236b003479468c82} unusual php phpi
故里[TRUE]
2023/04/21
8100
2023年西湖论剑
Python实现各种加密,接口加解密不再难
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种加密,接口加解密再也不愁。
可可的测试小栈
2021/12/17
6.9K0
Python实现各种加密,接口加解密不再难
普林斯顿算法讲义(四)
根据弹性碰撞的法则使用事件驱动模拟模拟 N 个碰撞粒子的运动。这种模拟在分子动力学(MD)中被广泛应用,以理解和预测粒子级别的物理系统的性质。这包括气体中分子的运动,化学反应的动力学,原子扩散,球体堆积,围绕土星的环的稳定性,铈和铯的相变,一维自引力系统以及前沿传播。相同的技术也适用于其他涉及粒子系统的物理建模领域,包括计算机图形学,计算机游戏和机器人技术。我们将在第七章再次讨��其中一些问题。
ApacheCN_飞龙
2024/03/16
1740
普林斯顿算法讲义(四)
Koa基于NodeJS的WEB框架
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
码客说
2021/04/13
2.2K0
Koa基于NodeJS的WEB框架
椭圆曲线加密与NSA后门考古
本文主要介绍椭圆曲线的基本原理以及基于椭圆曲线的密码学实现,包括ECC加密、ECDH秘钥交换以及ECDSA签名算法,并介绍其中潜在的一些安全问题。其中分析了两个ECC实现相关的真实案例,分别是索尼PS3的签名问题和美国国家安全局NSA留下的椭圆曲线后门。
evilpan
2023/02/12
1.2K0
椭圆曲线加密与NSA后门考古
秘密共享—隐私计算和区块链共识中的榫卯
2018年5月正式生效的GDPR是欧盟“史上最严”条例,是数十年来数据安全和数据隐私法规方面最重要的一次变化。随后,2019年生效的加州CCPA,对个人数据及信息保护提出了严格的界定和保护要求。至此,GDPR和CCPA对欧美国家在数据安全和隐私行业的立法产生了持续的影响。在我国,2021年6月10日,中华人民共和国第十三届全国人民代表大会常务委员会第二十九次会议正式表决通过了《中华人民共和国数据安全法》。历经三次审议和修改通过的《数据安全法》将于2021年9月1日正式施行。在数据安全和隐私保护方面,企业合规性是一个迫在眉睫的事情。
绿盟科技研究通讯
2021/09/06
3.8K0
若通过验证可颠覆美国后量子密码设计,清华陈一镭预印论文破解格密码
在计算机领域,解决格上的近似最短向量问题(Approximate Shortest Vector Problems in Lattices。Lattice Problems)以及与之等价的容错学习问题(Learning with Errors,LWE)是经典的算法难题,科学界普遍认为它们超出了传统计算机的能力范围。
机器之心
2024/04/12
1180
若通过验证可颠覆美国后量子密码设计,清华陈一镭预印论文破解格密码
开源密码存储引擎 Vault 的安装与使用
vault 是一款 HCP 推出的密钥管理引擎,用来集中存储集群运行过程中所需要的秘密信息,例如数据库的访问凭证、密码、密钥等。它保证了存储与通信过程的保密性,这对于我们无处不在的敏感信息的数据安全显然是十分必要的。
用户3147702
2022/12/21
3.5K0
开源密码存储引擎 Vault 的安装与使用
密码学原理与实践笔记 - wuuconix's blog
移位密码。和凯撒密码原理类似。只不过移动的key不是3而可以是0~25中的任何值。所以Caesar Cipher是Shift Cipher的一种特例。
wuuconix
2023/03/13
9320
密码学原理与实践笔记 - wuuconix's blog
不可区分混淆被实现,计算机科学家摘得这颗密码学「皇冠上的明珠」
机器之心报道 编辑:魔王、小舟 iO(Indistinguishability Obfuscation,不可区分混淆)是密码学中黑科技一样的存在,但很多人认为它并不存在。最近,一些研究人员提出了新的 iO 协议。 2018 年,加州大学洛杉矶分校博士生 Aayush Jain 前往日本演讲,介绍他和同事正在开发的一款强大的加密工具。在他陈述团队在 iO 方面的努力时,有观众提问:「我认为 iO 不存在。」 当时,这种看法较为普遍。如果 iO 确实存在,它不仅可以隐藏数据集合,还可以隐藏计算机程序的内部工作机
机器之心
2023/03/29
4230
不可区分混淆被实现,计算机科学家摘得这颗密码学「皇冠上的明珠」
《深入浅出密码学》——读书笔记(更新中)
h1 { text-align: center } h2 { text-align: center } .picture { text-align: center } thead th, tfoot th { text-align: left; background: grey; color: white } tbody th { text-align: left; background: Gainsboro; color:white }
Homqyy
2023/03/06
9670
《深入浅出密码学》——读书笔记(更新中)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)
在第一章中,我提到最常见的监督学习任务是回归(预测值)和分类(预测类)。在第二章中,我们探讨了一个回归任务,使用各种算法(如线性回归、决策树和随机森林)来预测房屋价值(这将在后面的章节中进一步详细解释)。现在我们将把注意力转向分类系统。
ApacheCN_飞龙
2024/05/24
3340
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)
bWAPP练习
虚拟机下载地址: https://www.vulnhub.com/entry/bwapp-bee-box-v16,53/
全栈程序员站长
2022/11/09
1.2K0
bWAPP练习
蚂蚁区块链第7课 零知识证明隐私保护原理和蚂蚁BAAS接口调用实现
本文试图普及隐私保护和零知识证明的相关技术知识,尝试使用更简单的描述来理解复杂的数学算法和技术原理。同时,也提供了蚂蚁区块链已经实现的隐私保护的接口函数说明。 本文涉及的专业知识有零知识证明,zk-SNARKs和 BulletProofs(防弹证明),佩德森承诺等。
辉哥
2019/04/01
1.9K0
蚂蚁区块链第7课 零知识证明隐私保护原理和蚂蚁BAAS接口调用实现
零知识证明学习资源汇总
Github 地址:https://github.com/sec-bit/learning-zkp/blob/master/zkp-resource-list.md
爬虫
2019/11/15
1.5K0
用50多年时间,探索最令人困惑的复杂性理论知识极限
证明问题难以解决究竟有多难?元复杂性(meta-complexity)理论研究者数十年来一直探究这个问题。近期的一系列研究成果开始给出这个问题的答案。复杂性理论研究者正直面着最让人困惑的问题:复杂性理论本身。
机器之心
2023/10/29
2840
用50多年时间,探索最令人困惑的复杂性理论知识极限
我的Android进阶之旅------&gt;Android采用AES+RSA的加密机制对http请求进行加密
作者:欧阳鹏 来源:http://blog.csdn.net/ouyang_peng/article/details/50983574(点击文末阅读原文前往) 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息。虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容。因此,需要对之前未加密的登录信息进行加密。在网上搜到一篇关于AES+RSA加密方案的文章,如下面链接所示,按照该方案成功解决了加密问题,在这里记录一下
java达人
2018/01/31
2.2K0
我的Android进阶之旅------&gt;Android采用AES+RSA的加密机制对http请求进行加密
NumPy 基础知识 :1~5
在过去的十年中,Python 已成为科学计算中最受欢迎的编程语言之一。 其成功的原因很多,随着您着手本书,这些原因将逐渐变得明显。 与许多其他数学语言(例如 MATLAB,R 和 Mathematica)不同,Python 是一种通用编程语言。 因此,它为构建科学应用并将其进一步扩展到任何商业或学术领域提供了合适的框架。 例如,考虑一个(某种)简单的应用,该应用要求您编写软件并预测博客文章的受欢迎程度。 通常,这些是您要执行此操作的步骤:
ApacheCN_飞龙
2023/04/23
5.7K0
NumPy 基础知识 :1~5
推荐阅读
相关推荐
密码学[2]:群 环 域
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文