怎么安全地在 web 前端存储私钥?

2021-07-03 23:13:52 +08:00
 JasonLaw

最近在看安全方面的知识,为了防止重放攻击,我查阅了一些资料。

also24 的回复说得非常棒。

单向的 https 只能保证你请求的银行真的是银行,但银行无法确定你是你。

加了 token 才能让银行知道你是你,但是银行不知道你带的东西是你自己带的,还是别人塞进你包里的。

加上 nonce 和签名,才能让银行知道这些东西全都是你带的,别人没有夹带,但是银行不知道这个你,是否是用 1 年前的你克隆出来的。

加上时间戳,银行才能确定面前的你确实是当前时间点真实存在你,东西也是你带的东西。

最后,稀奇古怪的加密又是什么呢? 答:你带的东西是一个保险箱~


但是我有一个疑问,产生签名是需要密钥的,那怎么安全地在 web 前端存储私钥呢?

8511 次点击
所在节点    程序员
46 条回复
JasonLaw
2021-07-04 07:30:29 +08:00
@unco020511 #17 “私钥加密,公钥解密”是什么东西?
FaiChou
2021-07-04 08:45:42 +08:00
@JasonLaw 你想了解的是:对称加密和非对称加密。去搜搜这相关的知识吧。元知识需要学的,不靠问。
mxT52CRuqR6o5
2021-07-04 09:23:14 +08:00
私钥不私的话破坏了很多假设,安全性就无法保证
ZeawinL
2021-07-04 10:06:12 +08:00
前端使用用户密码 hash 作为密钥?
evilStart
2021-07-04 10:29:52 +08:00
@FaiChou 该学习的是你吧。明明是公钥加密,私钥解密。要是能用公钥解密那这加密还有啥意义。
vibbow
2021-07-04 10:39:24 +08:00
U 盾就是干这个事情的呀
unco020511
2021-07-04 10:43:31 +08:00
@JasonLaw 非对称加密除了加密外,还有一个应用叫做数字签名,完整的非对称加密流程包括:对原文非对称加密+签名,也就是实际是将密文(公钥加密的)+签名(实际为 hash 后用私钥进行一次非对称加密运算得到)一起打包发送,这样做既保证了数据不会被中间方窃听,又保证了数据的完整性以及来源
JasonLaw
2021-07-04 10:43:36 +08:00
@vibbow #26 前面已经有很多人说了这个了,如果没有其它想法的话,最好不要重复同样的东西。如果冒犯到你的话,我先说句抱歉,我只是不想让主题包含太多没意义的信息。
unco020511
2021-07-04 10:46:58 +08:00
@evilStart 25# 签名
BoringBB
2021-07-04 10:50:21 +08:00
使用客户端证书啊,在 ssl 握手的时候,服务器可以要求客户端提供证书来验证身份
geniussoft
2021-07-04 10:56:34 +08:00
@also24 啥? U 蹲被破解?

以后开通网上银行,要求用户默背 2048 位密钥,并且熟练掌握口算非对称加密,绝对不能动笔😂
also24
2021-07-04 10:57:02 +08:00
@unco020511 #17
看内容要参照上下文,不要直接臆测某句话的意思。

『单向的 https 』 指的是 https 只有『单向加密』么?
当然不是,参照上下文可以得出,此处指的是最常使用的,只有『单向认证』的 https,在后面的楼层中,我专门强调了 https 是支持『双向认证』的。

那『加密』和『认证』有什么区别呢?
加密只是用来保证数据在传输的过程中,其它人无法解码。
认证则是为了证明自己是自己。

在最常见的『单向认证』的 https 使用形式中,只对服务器端进行了『认证』。
客户端内置有可信根证书机构的证书信息,服务端持有根证书签发的中间证书签发的服务器证书(大部分场景下,还包含了相应的证书链信息),客户端通过验证服务端的证书,即可确认返回的信息是否确实来自对应的服务端。

也就是,让你确认『你请求的是银行』。

但是此时,银行能通过这个 https 连接信息确认『你是你』么?当然不能,因为每个人都可以这样发起连接。
想要确认『你是你』,就必须通过登录等其它手段来进行验证。

此时,如果引入『双向认证』,也就是客户端也持有一份证书,在 https 握手的时候发给服务端,服务端验证证书可信后才会放行。
在这个场景下,如果每个人持有的证书是独立的,就可以做到银行通过 https 的握手信息就能确认『你是你』。


最后小结:
1 、不要把『加密』和『认证』混淆了,二者虽然有联系,但不等同
2 、最常见的 https 使用方式都是『单向认证』,但不要忽视了『双向认证』的存在
xylophone21
2021-07-04 11:19:44 +08:00
说一下我的理解吧
1 、U Key 这种,额外的硬件。里面的私钥可以认为是读不出来的
2 、不能用 U Key,那么只能做一些假设
2.1 用户不会自己配合泄露私有,特别是配合很复杂时。比如打开浏览器的开发者页面做一顿骚操作,把手机借给黑客等。
2.2 黑客不能通过程序很容易的获取到,主要靠 OS 、浏览器保护。比如不能读别人的 localstorage,不允许跨域等
2.3 万一用户配合泄露了,不影响其他人
JasonLaw
2021-07-04 11:57:56 +08:00
@unco020511 #27

你说“完整的非对称加密流程包括:对原文非对称加密+签名”,但是我看了 https://en.wikipedia.org/wiki/Public-key_cryptography,里面所说的是:

With public-key cryptography, robust authentication is also possible. A sender can combine a message with a private key to create a short digital signature on the message. Anyone with the sender's corresponding public key can combine that message with a claimed digital signature; if the signature matches the message, the origin of the message is verified (i.e., it must have been made by the owner of the corresponding private key).

按照它所说的,非对称加密是非对称加密,签名是签名,并不是“包括”的关系。

---

还有你说“签名是用私钥进行一次非对称加密运算得到”,我不同意加密这个说法,“签名是使用私钥产生的”会更加准确。

---

我对安全方面并不是特别了解,如果有错误的地方,希望你能够指出。
unco020511
2021-07-04 12:20:32 +08:00
@JasonLaw #27 没错,你说的更准确,非对称加密不包括验签,我想表达的是非对称加密与验签往往成套出现.所以我用的是"非对称加密流程",而不是"非对称加密"
----你说的签名使用私钥产生这句话肯定是对的,因为"产生"这个词范围很大,我想表达是更具体一些的原理,非对称加密的算法有多种,但最终都是经过"复杂精密设计过的数学运算",有一个特点就是非对称加密和解密使用的是同一个"计算方式"(并不是逆运算,这与对称加密的算法有本质区别),所以加密和解密其实都是同样的数学运算,如果要抠字眼,那加密和解密其实不应该有严格区分.
----
“签名是用私钥进行一次非对称加密运算得到”,可以改成"签名是用私钥进行一次非对称运算(可能没有这个词,那就是数学运算)得到"
-----
我认为我俩表达的实际上完全是一个东西
JasonLaw
2021-07-04 12:24:12 +08:00
@FaiChou #22 你的这个回复是回复哪个的?如果你愿意的话,可以指出我的错误,而不是不愿意分享的样子。
unco020511
2021-07-04 12:28:37 +08:00
@also24 #32 抱歉,我是没有看到你原贴后面楼层的内容,只是看到楼主单独贴出的内容,所以就进行了讨论,误解了你的观点.
-----
"银行确认是你"这个问题,你说的是业务方面[权限][用户]的身份确认,我说的是主机 a 与主机 b 通信中的身份确认,都没有错,只是没有对到一起

周末愉快
JasonLaw
2021-07-04 12:34:48 +08:00
@unco020511 #37
@also24 #32

我的错🤐
also24
2021-07-04 12:39:02 +08:00
@JasonLaw #34
@unco020511 #35
关于『签名』,我想要补充一下,其实『签名』这个词,也是可以产生误解的。

你们在讨论的『签名』,其实默认了在说『 RSA 签名』,是一种具体的签名机制。

原回复中的『签名』,其实是一个宽泛概念,只要能起到对内容验证的作用,就算签名,实际上,很多时候都在用更简单的方式来生成这种签名。

例如:md5( data + sk + nonce + ts)
这就是一种很常用的模式,它与 『 RSA 签名』毫无关联,但是从作用上来说,也可以被称作『签名』。
Lemeng
2021-07-04 14:42:17 +08:00
u 盾,多少年前就可以。现在估计企业的银行业务都还是靠 u 盾,不过普通人用的少了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787379

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX