银行登录的两层加密
1.传输层加密 TLS/HTTPS
2.应用层加密
前端js+公钥加密算法 来加密密码
加密时用的密钥时银行的公钥,由服务器下发到页面中
农行的鉴权机制:
1.农行前端加密流程
输入账号、密码、验证码
前端脚本加密处理
获取服务器下发的公钥
加入防重放参数,时间戳、随机数等?
使用公钥加密账号和密码
构造登录请求
加密后的账号、加密后的密码、验证码
防重放token?
通过https发送到服务器
服务器端解密与校验
用私钥解密账号、密码
校验密码是否正确
检查防重放token是否有效
成功 则建立会话Session/Cookie
问题:
服务器下发的公钥和解密时的私钥有什么联系吗?
要在哪里加入防重放参数?怎么判断这些放重返参数是否合理呢?
防重放token指的是什么,如何检验呢?
session和cookie有什么联系与区别
这里的加密与传输层TLS/HTTPS的加密有什么联系与区别?
回答:
-公钥和私钥是一对,来源于非对称加密算法 RSA/SM2
公钥可以加密但不能解密,这个安全地发送到浏览器端
私钥只能再服务器端保存
-防重参数把时间戳、随机数、或者一次性 token 拼到待加密的数据中
服务器解密后确认请求是新鲜的
可以把参数拼到明文再加密,或是参数单独作为字段传输
-防重放token是一次性或是短期有效的随机串,由服务器生成,下发给浏览器
浏览器在下一次发送请求时必须带上
服务器收到后检查token是否存在于有效列表,是否过期,是否已被使用(用过就作废)
-session存在于服务器端,保存用户的登录状态和数据(用户ID,权限等),每个session由唯一ID
cookie存在于客户端(浏览器端),存储少量数据,如session ID
Cookie 里通常会保存 Session ID,浏览器每次请求都会带上这个 Cookie → 服务器用 Session ID 找回对应的 Session 数据
-TLS/HTTPS传输层加密,数据一旦进入通道进行整体加密
前端加密在应用层(浏览器)先把敏感字段单独加密,还可加入额外安全机制如防重放,相当于第二道保险
继续提问:
每次登录下都要有一对独一无二的公钥和私钥吗?不一定,可能一段时间更换
服务器怎么判断请求是新鲜的呢?检查时间戳(浏览器把当前时间戳发给服务器,服务器解密后检查时间戳是否在允许范围内)、随机数(服务器提前给浏览器一个一次性随机数,浏览器加密时带上,服务器解密后比对)、一次性token(用过一次即作废)
token相当于是链式生成的,就是上一个请求生成的被下一个请求使用?不一定,有独立一次性token(登录前服务器给一个token,登录时要把token一起发给服务器,用一次作废)和链式token(基于前一个生成下一个)
登录成功后的鉴权:
Session + Cookie(银行常用)
服务器创建一个 Session(里面存你是谁、权限等信息)
把 Session ID 放到 Cookie 发回浏览器
之后浏览器的每个请求,都会自动带上这个 Cookie → 服务器用 Session ID 找到你的登录状态
Token 鉴权(部分移动端或 API 用)
登录时直接返回一个加密签名的 Token(比如 JWT)
之后每个请求都带上 Token,服务器解密验证
会话保持的安全机制 :
银行会加很多额外的检查
绑定客户端信息:
会话记录下你的 IP、浏览器指纹、设备号
如果变化太大,会要求重新登录
会话超时:
- 一段时间(如 10 分钟)没操作,自动退出
二次验证:
- 高风险操作(比如转账)需要短信、U盾、动态口令
登录后的数据传输:
依然走 HTTPS
关键字段(交易密码、转账金额)通常还会再次在前端加密(和登录时类似的加密机制)
会结合一次性 token(防止转账请求被重放)
银行的二次验证机制:
1.短信验证码
登录异常时要求,如新设备、可疑IP;高风险操作时,如转账修改密码添加收款人
由服务器生成,随机数生成器(最好是加密安全的 RNG),防止可预测
传输时,从银行服务器到短信网关 → 有专用加密链路;从短信网关到手机 → 走运营商网络(这一段不算非常安全,但因为有效期短、一次性,风险可接受)
验证码必须和用户会话绑定(不能用别人手机收到的验证码在你的会话里验证)
会进行安全增强,限制尝试次数(输错 3~5 次就锁定);限制发送频率(防止验证码被暴力请求);结合前端 token(验证码输入请求本身也带防重放参数)
银行会把它作为一道防线而不是唯一防线
问题:
短信网关是什么?
数据从银行发出到收到短信具体经过什么流程?
2.U盾
银行生成一对密钥包括公钥和私钥,私钥存在U盾硬件中且不可导出,公钥存在银行服务器
使用时,银行发给用户一段挑战数据,U盾用私钥签名,签名结果发回银行,银行用保存的公钥验证签名
U盾还可能参与加密数据
问题:
U盾硬件具体指的是什么,是物理实体码?放在哪里呢?类似U盘,内部有安全芯片,能存私钥和执行加密操作,但不允许私钥被直接读取(类似内部黑箱),用户拿着
用私钥签名是什么意思?可能先哈希,再加密哈希值
这里的U盾是不是类似农行中的k宝?是的
3.动态口令
密码一次性,很快会过期
硬件令牌
比如银行给你一个小巧的钥匙扣/卡片,上面有一个屏幕,每隔 30 秒跳出一个新 6 位数字。
登录网银或转账时,系统会要求你输入它当前显示的数字。
原理是令牌和银行后台的“种子密钥”相同,时间同步,所以生成的数字一致。
手机 App 令牌
像 Google Authenticator、微软验证器、支付宝宝令。
不用硬件设备,直接在手机上用 App 生成 6 位数字(通常 30 秒更新一次)。
常用于公司 VPN 登录、GitHub、邮箱的二次验证。
短信/邮件一次性验证码(也是动态口令的一种)
登录时服务器发一个验证码到你的手机或邮箱,你在几分钟内输入才有效。
虽然常见,但安全性比硬件/App 令牌低,因为短信可能被劫持。