图:1原理

2 HTTPS(有些潦草)

HTTP2.0 HTTP 协议入门 - 阮一峰的网络日志
证书透明度(CT)
逻辑我差不多知道了但是吧主要都是依靠证书的正确性。证书如果伪造那整个体系就荡然无存。谷歌提出了 证书透明度(CT)证书的有效补充
和区块链技术非常类似,通过密码学手段(Merkle hash tree)保证了其数据只能增长,但修改、插入、删除都会被发现
(协商缓存那里也是巴拉巴拉) 其实吧就是吧可以看https://zhuanlan.zhihu.com/p/43789231,这个几乎全解决了,我一点也不想整理。。。
1 由于http协议本身是无状态的,因此协议本身是不支持“登录状态”这样的概念的,必须由项目自己来实现。
2 服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。
啊啊啊问注册逻辑原来是想问https!
那么看下知乎这篇文章,希望能获得一点什么 【这个写的很好0.0 感恩!!!就靠它啦~】
链接:https://zhuanlan.zhihu.com/p/43789231 写的很棒!
1.如果用对称加密,那么~
如果通信双方都各自持有同一个密钥,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)。
然而最大的问题就是这个密钥怎么让传输的双方知晓,同时不被别人知道。(确实)如果由服务器生成一个密钥并传输给浏览器,那在这个传输过程中密钥被别人劫持到手了怎么办?之后他就能用密钥解开双方传输的任何内容了,所以这么做当然不行。可以预先保存所有的,但显然也不太现实
其他注意:
1 采用对称加密,如果只使用一个秘钥,很容易破解;如果每次用不同的秘钥,海量秘钥的管理和传输成本又会比较高。
2
千万千万千万不能明文保存密码【那么传递的时候是传的什么????传哈希????】
千万不要用明文存储密码(不管是存在数据库还是日志中)
加密部分
自己总结:
1 因为是单向的哈希,网站也不知道你的密码是什么,只有你自己输入之后按照哈希单向进去,你输入的哈希=存储的哈希,才ok。所以“找回密码” 只能重置,因为网站并不知道你的密码是什么(可以这么说hhhh)
2 如果是验证你曾经用过的密码,那应该也是验证你密码去做哈希运算比较存储的哈希。
以下来源ryf-找回密码登录设计
秘钥部分
单钥 DES(Data Encryption Standard)
双钥 RSA( Rivest-Shamir-Adleman)公钥用来加密信息,私钥用来数字签名
a) 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立,所有的(公钥, 私钥)对都是不同的。
b) 用公钥可以解开私钥加密的信息,反之亦成立。
c) 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。
因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。目前,世界上最主要的数字服务认证商是位于美国加州的Verisign公司,它的主要业务就是分发RSA数字证书。
为什么RSA能够做到非对称加密呢
简单来说,RSA利用的原理是,如果两个互质关系的正整数的乘积足够大,是极难进行因式分解的(目前被破解的最长RSA密钥是768个二进制位,而正常使用的至少是1024位的密钥 极其重要就用2048位)。
通过一定的运算,把某计算结果和乘积作为公钥,另一个计算结果和乘积作为私钥,即可以实现,利用公钥进行加密,并利用私钥进行解密。具体的数学公式推导和证明可以参考RSA算法原理。↓ RSA算法原理(二) - 阮一峰的网络日志
HTTP与https
常规的http请求,所有信息明文传播,只要中间人在链路中的任意阶段进行劫持,就会带来三大风险:
- 窃听风险(eavesdropping):第三方可以获知通信内容。
- 篡改风险(tampering):第三方可以修改通信内容。
- 冒充风险(pretending):第三方可以冒充他人身份参与通信。
怎么解决这些问题?用https。
https 可以认为是 http + TLS TLS 是传输层加密协议,它的前身是 SSL 协议,如果没有特别说明,SSL 和 TLS 说的都是同一个协议。
SSL/TLS协议是为了解决http的三大风险而设计的,希望达到:
- 内容加密。所有信息都是加密传播,第三方无法窃听。
- 身份认证。配备身份证书,防止身份被冒充。即使被 DNS 劫持到了第三方站点,也会提醒用户有可能被劫持
- 数据完整性。防止内容被第三方冒充或者篡改。具有校验机制,一旦被篡改,通信双方会立刻发现。
百度抓包,有个jsencrypt库(加密用)(印科瑞普特)
经常被大家用来加密的算法有MD5和SHA系列(如SHA1、SHA256、SHA384、SHA512等)。
通常黑客在侵入保存密码的数据库之后,他会随机猜测一个密码,生成一个哈希值。如果该哈希值在数据库中存在,那么他就猜对了一个用户的密码。如果没有猜中也没有关系,他可以再次随机猜测下一个密码进行尝试。
事实上黑客为了提高破解密码的效率,他们会事先计算大量密码对应的各种哈希算法的哈希值,并把密码及对应的哈希值存入一个表格中(这种表格通常被称为彩虹表),在破解密码时只需要到事先准备的彩虹表里匹配即可。因此现在黑客们破解仅仅只用哈希算法加密过的密码事实上已是不费吹灰之力。
加“盐”提高安全性
为了应对黑客们用彩虹表破解密码,我们可以先往明文密码加盐,然后再对加盐之后的密码用哈希算法加密。由于盐在密码校验的时候还要用到,因此通常盐和密码的哈希值是存储在一起的。
采用加盐的哈希算法对密码加密,要确保要往每个密码里添加随机的唯一的盐,而不是让所有密码共享一样的盐。
虽然加盐的算法能有效应对彩虹表的破解法,但它的安全级别并不高,因为计算哈希值耗时极短,黑客仍然可以用穷举法来破解,只是增加了一些耗时。
用BCrypt或者PBKDF2增加破解的难度
为了应对暴力破解法,我们需要非常耗时的而不是非常高效的哈希算法。BCrypt和PBKDF2算法应运而生。
这两个算法最大的特点是我们可以通过参数设置重复计算的次数,重复计算的次数越多耗时越长。如果计算一个哈希值需要耗时1秒甚至更多,那么黑客们采用暴利法破解密码将几乎不再可能。破解一个6位纯数字密码需要耗时11.5天,更不要说高安全级别的密码了。
如果我们想要尽可能保证用户的信息安全,我们需要做以下的工作
- 使用https请求
- 利用RSA加密密码并传输数据
- 用BCrypt或者PBKDF2单向加密,并存储
注意!加盐哈希也容易破解!(穷举法,彩虹表)
用BCrypt PBKDF2
这两个算法最大的特点是我们可以通过参数设置重复计算的次数,重复计算的次数越多耗时越长。如果计算一个哈希值需要耗时1秒甚至更多,那么黑客们采用暴利法破解密码将几乎不再可能。破解一个6位纯数字密码需要耗时11.5天,更不要说高安全级别的密码了
(就是说,把第几次验证也作为一个参数加入字符串~~ 比如说你的验证码2分钟就过期了,但是破解就很慢了以此保证安全性)
来源:https://juejin.cn/post/6844903604944371726#heading-8
HTTP
S(背诵部分)
如果我们想要尽可能保证用户的信息安全,我们需要做以下的工作
- 使用https请求
- 利用RSA加密密码并传输数据
- 用BCrypt或者PBKDF2单向加密,并存储
https的加密过程 Akara的前端笔记 (这个链接总结的非常精炼)
找回密码(概念理解来自ryf)
一个网站要想保证密码安全,第一步就是以正确的方法保存密码。一般说来,密码有三种保存方式。
(1)明文保存(×××)
"明文保存"就是用户的密码原文不动地写入数据库。这种方式最不安全,极易泄漏,应该严格禁用。
(2)加密保存
"加密保存"就是使用密钥,将密码加密后,以密文保存进数据库。这种方式虽然有一定的安全性,但是终究还是可以用密钥还原密码。因此,还是存在泄漏的可能,也不推荐使用。
(3)哈希保存aaaaa
"哈希保存"就是对密码使用哈希算法,将哈希值保存进数据库。为了增加随机性,防止彩虹表这一类的工具,计算哈希的时候,每个用户都有一个不一样的盐值(salt),也会同时保存进数据库。
哈希是单向运算,无法还原,所以即使哈希值泄漏,一般来说,也不会暴露用户的原始密码。
第一条规则:密码永远都要哈希保存
第二条规则:找回密码就是让用户重置密码。
第三条规则:重置密码的时候,要给出一个链接,让用户到网页上自己修改密码。
重置链接由于是明文传播,而且直接修改密码,所以必须有失效时间。一般来说,可以设成10分钟失效
第四条规则:重置密码之前,如果用户提供了错误的邮件地址,不要提示他。
如果提示的话,你可以知道你的朋友是否在AltPorn上注册了(很大可能性是他本人注册使用的),这样就算隐私泄漏了吧~ (其实注册的时候,尤其是一些敏感网站应该care下的)
正确的做法是,不管用户输入什么邮箱,都向该邮箱发邮件。在邮件里说明,有人尝试重置密码,但是他输入的邮箱不在数据库里面。(发这种邮件带上ip地址)
第五条规则:重置密码的时候,识别用户最好依靠邮件地址,而不是用户名。
还有就是加上验证码,回验个人信息
题外话:github之争+手动探究,F12那一大坨是什么?