一、MD5签名(防篡改)
MD5单向加密:明文——加密(不可以解密)——只能对比加密结果
客户端
- 要加密的字段
- 字段按一定顺序排列
- 可选字段,若为空,是否加密(不传?name=null?name=“” 或者name=)
- key字符串(只在加密时使用,报文中不传)
- md5加密
- 把加密串加入请求报文
服务端: - 接收请求
- 取出要加密的字段
- 按同样顺序排序
- key字符串
- md5加密
- 对比2次加密的结果是否一致
转账:
- 转出账户:accountOut=62284800001
- 转入账户:accountIn=848402320002
- 转账金额:amount=10000
第1步:排序
amount=10000&accountOut=62284800001&accountIn=848402320002
第2步:key
key=我不是李白
第3步:拼成待加密的串
amount=10000&accountOut=62284800001&accountIn=848402320002&key=我不是李白
第4步:md5加密
sign=9E1D4D4ADBC5588A31B4D523BE8E8697
第5步:发送报文
accountOut=62284800001&accountIn=848402320002&amount=10000&type=RMB&sign=9E1D4D4ADBC5588A31B4D523BE8E8697
篡改:(转入账户改为848402320888)
accountOut=62284800001&accountIn=848402320888&amount=10000&type=RMB&sign=9E1D4D4ADBC5588A31B4D523BE8E8697
服务端解析:accountOut=62284800001&accountIn=848402320888&amount=10000&type=RMB&sign=9E1D4D4ADBC5588A31B4D523BE8E8697
第1步:取加密字段
amount=10000&accountOut=62284800001&accountIn=848402320888
第2步:key
key=我不是李白
第3步:拼成待加密串
amount=10000&accountOut=62284800001&accountIn=848402320888&key=我不是李白
第4步:md5加密
sign2=2001F02A45A3B86C16F1E6AA9F92B74A
第5步:对比请求报文中的sign
9E1D4D4ADBC5588A31B4D523BE8E8697
2001F02A45A3B86C16F1E6AA9F92B74A
判断出被篡改,拒绝请求
自动化测试
请求数据每次都变,所以签名也要跟着变,这就要求每次都要执行一个加密算法,算出签名串
- 找开发要key、加密字段、顺序、为空处理方式等
- MD5加密类
- 报文的加密字段参数化(为了加密脚本能取到加密字段)
- beanshell取出加密参数值,根key一起拼成待加密的串,调用MD5加密,将加密结果存入变量池
- 报文里面通过参数化变量取参与加密的字段和签名值
beanshell前置处理器
var name=vars.get("name");
var age=vars.get("age");
var key="我不是李白";
var sign=MD5Tool.sign("name="name+"&age="+age+"&key="+key);
vars.put("sign",sign);
二、RSA加密(防止信息泄露,也在一部分程度上防篡改)
签名,就是防止篡改,所以签名是肯定不能支持被反向解密,否则一反解,key知道,字段知道了,顺序知道了,还有什么安全性啊?所以,只能用单项加密技术
双向加密,也就是:明文——加密成密文——网络传输——解密——明文
公钥加密,私钥解密
A、B两个系统交互:
A调用B的流程:
- B系统生成一对公私钥,并将公钥提供给A
- A系统发起请求,并使用B提供的公钥将报文加密
- B系统使用私钥对A的请求报文解密
B回调A的流程:
- A系统生成一对公私钥,并将公钥提供给B
- B系统发起回调请求,并使用A提供的公钥将报文加密
- A系统使用私钥对B的请求报文解密
生成公私钥
## 命令
ssh-keygen -t rsa
一直回车
## 公私钥文件
id_rsa:私钥
id_rsa.pub:公钥
## 公钥内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxZyMTtvpGZ
CdsnZ3HmyUw+vj1eeWgcPRV5uMLrQuEzN16VXTpRtHIp
iF+STyuMgl4hc3/8Pqye5ERcy6nw9oEK1lE8fSHOn7w2xO
GICpGEn+8FmlLINYVx9stmAk1gd6w4fxMY511+fy04ZihG
WJRNv24eMp/fnMl3FMhJuBA69YzBpU0V+db10aS7WdL3
A2Y7PPSWF4v72ao7OkedVIu9YPxDdXGfqVXkr4bHWgTd
MriFnRdyi35cFEyJ6BA9wzG3XaSJhKD3f5qmp0pC00e36
MQLollyfaPZeo7hhGZgpG4Y05nZ13DRaIR/owX5wJ1rVBj
0OWGLF3MDFgPey3T Administrator@WIN7-1710302028
## 私钥内容
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsWcjE7b6RmQnbJ2dx5slMPr49XnloHD0VebjC60LhMzdelV0
6UbRyKYhfkk8rjIJeIXN//D6snuREXMup8PaBCtZRPH0hzp+8NsThiAqRhJ/vBZp
SyDWFcfbLZgJNYHesOH8TGOddfn8tOGYoRliUTb9uHjKf35zJdxTISbgQOvWMwaV
NFfnW9dGku1nS9wNmOzz0lheL+9mqOzpHnVSLvWD8Q3Vxn6lV5K+Gx1oE3TK4hZ0
Xcot+XBRMiegQPcMxt12kiYSg93+apqdKQtNHt+jEC6JZcn2j2XqO4YRmYKRuGNO
Z2ddw0WiEf6MF+cCda1QY9DlhixdzAxYD3st0wIDAQABAoIBAQCvG3+7KQS3UIq9
ooKoERLP2xq8qvqmuHflBscbsk5JYjJHW2zQCjBuXtV2ovG7e/ZvOZwRwxqh7GhQ
EiJ+RErBjMxLyow0ot/D/Gq0HLG9gusEjBaYqqvGygQlaAnHAA8BB7+S40z8s6nm
HTwb4EN0qNQeL1SqLfWY7HY9pfL7AGlCf0Tbp4cGKo9iB1W/PIpj2IepafXXUY4y
BKPTy6IJWNnNPsdS7IfLv7z8XJXhY5FkcE0u/K3kaC4ZGmCfzucDZFlQCZt+s3lL
gnVMC95AvF1IOw/507UXjt0bBlJuyrkzm0aYPF+fUNGSTbA9Emf56b8D1EvzLdjr
Rd9wl3BxAoGBAOPay2k9Zw1nqBT0WSnSlUsTDQL08IHGTSB3aGtd5YV7FlaImcmI
5ompAAamCcqaEdE+IOJWl3RlFM9lXoRHnmLsQC4RbQ5BE4rzP28hxuFPX2euINDu
8feyjx/ZrM3t6O019k+kglRP8rZvPoi6l+XPrU4DmYFGLvwkO1RCMeoLAoGBAMdQ
9ZVewvd2HoLf1GkCwFIXf9VghAdabZFLbF4XX5BG9/lM9HyfuOuF9Mw7t0Kq+JTY
dpdISzzNb0e3U6KSfdUCGY/82ckl5uaZTLtrkh6VYlRuVQAX8lYYMDKHiovEBUio
MXmh6fLX1giMSW579uS4o/XlWZCJCUPgKqmytHBZAoGADxJW6CQun91eadxr1W9f
frLI5owrKHpkeaRMXOW+G+Ezbg/lFEag8TQjk00CUst0KEISzMXriMBy6vEKmnde
S67S4/k1HH9DeqpyZLh4PkkQx3vmIcvcZ4UBIJs2afy1rpMmMshv8oHDTTv4h/TH
vWTKUuG8EqgAzZ7b6cvjH1cCgYEAqBj3hgptlBbilK4Bjq7rVFDNV0AXGbyCO8/I
jXJY/m1cJb1pVNHAO6K2WqjiXi+jhqUpH12xVo5ME8fhmXLC/SrQNEejxalZm5Ie
zNJkYbbLPznuJi4MC+BKhdMaXdXsPuLbFyIfFNhDguIN7EhQaYXvgirz5posXjpo
wMYet8ECgYA7vmYWBL2nlEaAUSuWvaAm4wXJPXpP9tRl/N/wWDYx5x9Drh8MVH41
vvhvh+3LZLQkhEa1U7VQpwud5HMpUaA0oMyQW74CVMuKudmF+OeI7JoBZ5zS4aES
L+NJAaW69o34fspnXNLX/4Y9/hOPdy0Rh1xNp0Ij7N18CUt0Af+fAA==
-----END RSA PRIVATE KEY-----
自动化测试
- 要公钥证书
- RSA加密算法类
- 通过算法和证书生成加密串,参数化传入接口报文
支付接口:https协议加密传输(认证的证书),每个客户又会有一个专用证书对报文加密,报文内容还会有md5签名
原始报文:
serviceId=s001&amount=10000&accountOut=62284800001&accountIn=848402320888
签名后的报文:
serviceId=s001&amount=10000&accountOut=62284800001&accountIn=848402320888&sign=9E1D4D4ADBC5588A31B4D523BE8E8697
加密后的报文:(公私钥是针对接口的每一个客户的证书)
serviceId=s001&data=eV/mL+zfFVoG0vbhgFbejwI0wTzIw7qScRvBBZAwNnL4OTFr9WQgR70w45uLhEfuD4QtgJ2Zrb2RYkDnHHCodmElVxu4tilUtDS8k/788wLm+yMWtwjlFBs1xzFvdt9jpry24CmxtLvy9lZWBeMWbm+HbIIvNlxJANgfW1BUPQ0LZExY7+ibpGmrkRht8lLMxt5NN3Bwyu+0ZRJXI/jSgleWCX/FVc0iOE+0ogFsiZ2tip9NaNU7uRIfhibmYl0BMLY+HOqPCGnYULwuBKFjndVlnQZeg69YE2PaK7VBjizIHYsVV5n7VUfsekgzyMORKsZHlaGTT7CcLRReUECz0w==
https加密传输:第二次加密
浏览器会下载一个证书进行加密,web服务器的证书,加密是浏览器做的,解密是tomcat服务器做的
三、验证码
目的:不准自动登陆,只能人工手动
安全原理:猜不出服务端会生成什么验证码
- 服务端随机生成
- 客户端拿到随机码(图片、短信、语音)
- 客户端将随机码传给服务端,服务端验证是否一致
自动化测试(开发和测试环境):
第一条路:让开发把验证码功能关闭
第二条路:让开发改代码,放通特定验证码(万能验证码)
生产环境,绝对不会让做自动化(验证码不可能放通)
界面session会话和cookie
session:就是一个授权生成的字符串,http请求只要带上这个字符串,服务器都当做授过权
session
- session是服务端生成的一个授权字符串,返回给客户端(服务器端会保存)
- 客户端后续每个操作,都需要带上这个授权字符串,服务端就知道登陆过了
- 这个字符串叫什么名字不重要,一般带session或token字样,比如sessionId、xx_session、token、tokenCode
cookie
- 是浏览器提供的本地存储
- 只要服务器往http响应头的cookies里面放key、value键值对,浏览器就会自动存到本地
- 每次界面发htpp请求,浏览器自动会将cookie里面的值加到http请求头的cookies里面
session只是借用了浏览器的cookie功能
cookie和session学什么?
- 知道session的本质,就是服务端生成授权码,客户端带上授权码
- 如何使用浏览器的cookie,服务端往响应头的cookie加数据,从请求头的cookie取数据
以登陆和添加购物车为例:
添加购物车
- 商品
- 用户
http报文3部分
- 请求行(地址、请求方法、版本等)
- 请求头(对请求的描述)
- 请求正文(业务数据)
浏览器cookie
浏览器本地数据库
可以往cookie里面放东西
- 登陆的时候,服务器生成一个sessionID值,本地备份一份
- sessionID值存入到响应报文的响应头的cookie里面
- 浏览器收到响应报文,把cookie存到浏览器本地
- 下一次发请求,会自动把cookie的值取出来,放到请求头的cookie里面
- 服务器收到请求,到cookie里面查看是否有sessionID,如果有,跟本地做对比,一直,就说明登陆过了
- 根据sessionID,找到登陆时的用户,拿到用户的各类信息
token
sessionID
每次发请求,浏览器默认会把cookie里面的东西全部放到请求头里面,传给服务器
自动化测试:
- 添加1个cookie管理器
密码加密存储
第一种:密码加密成md5存储,每次登录的时候,先加密,再根数据库的md5串对比
问题:自己设个密码,到数据库取出来,修改别人的密码,设成跟自己的一样,全部破解成功
第二种:带key的md5加密,而且这个key是用户的某个属性。这样的话每个用户,同样的密码,md5出来也不一样
目标:
-
防止纯MD5加密,简单密码不能通过MD5库破解
-
保证不同用户的同一个密码加密后都不一样
-
防止将一个已知密码加密后的串改到要盗用的用户密码
-
用户设置的密码
-
选一个用户标识作为key:比如密码修改时间或用户名或手机号等
-
密码+key,然后md5加密传输和存储
数据库权限
c用户:o用户赋表权限给c用户,只能做查询或者新增等操作,一般开放给程序员
o用户:表的所有权用户,可以做增删改成等所有事
签名、加密、https、验证码、加密存储、脱敏、证书和算法跟业务程序分离
网友评论