微信支付的网络安全 - 王胜
协议规则
- 采用HTTPS传输
- POST提交
- MD5签名,请求和接收数据均需要校验签名,详见
- 调用申请退款、撤销订单接口需要商户证书
安全规范
- 签名算法
- 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
- 在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue
生成随机数算法
微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串
商户证书
获取商户证书
微信支付接口中,涉及资金回滚的接口会使用到商户证书,包括退款、撤销接口。
使用商户证书
- 商户证书安全
商户回调API安全
在普通的网络环境下,HTTP请求存在DNS劫持、运营商插入广告、数据被窃取,正常数据被修改等安全风险。商户回调接口使用HTTPS协议可以保证数据传输的安全性。所以微信支付建议商户提供给微信支付的各种回调采用HTTPS协议。请参考:HTTPS搭建指南。
参考资料:微信支付
安全『相对论』 - 曾铭
角色
介质
- 服务器
- API
- 网络传输过程
- 客户端
人
- owner: 开发者 内部人员
- 用户:消费者、商家
- 『坏人们』:黑客(白帽)、『友商』、路过……
分清角色才能明白设定一个安全逻辑是针对谁,解决什么问题。
目标
- 『一有适当的利润,资本就会非常胆壮起来。只要有10%的利润,它就会到处被人使用;有20%,就会活泼起来;有50%,就会引起积极的冒险;有100%,就会使人不顾一切法律;有300%,就会使人不怕犯罪,甚至不怕绞首的危险。』
- 没有绝对的安全,只有相对的安全
- 为了安全是否影响了普通用户?能否变通?
- 影响的是一个用户还是全部用户?
- 能否补救?主动?被动?
- 你不需要完美,你只需要比友商好一些
实践
聊聊发短信接口的案例
- get -> post
- 限制单日单个手机号,(避免单个手机号过多骚扰,产品不完整,建议加提示)
- 限制单个 IP 请求次数 (有必要,但要适量放宽,要跟踪结果)
- 图形验证码 (把问题转化为计算机不擅长的问题来保障安全,有必要,用户体验有影响,可优化)
- 一种 API 加密方式(根本问题是:API 如何判断这个请求是可信的客户端发来的)
1 | 客户端 - 网络传输 - API |
RSA -李仙鹏
在公钥系统中,我们采用公钥加密,私钥解密的方式,使得报文能够比较安全的传输。
假设A和B通信,但他们之间不通过对称密钥,B有一个公钥$K_B^+$和一个私钥$K_B^-$。为了与B实现通信,A首先需要获得B的公钥$K_B^+$对报文m进行加密,即$K_B^+(m)$;B收到A的加密报文后用私钥$K_B^-$进行解密,即$K_B^-(K_B^+(m))=m$。其中的加解密算法通常使用RSA(RSA取创始人Ron Rivest, Adi Shamir, Leonard Adleman的姓氏首字母)。
RSA工作方式
加密时,首先把报文m做e次的幂运算,然后做模n的算数运算,即$m^e\%n$;解密则先把上述密文值做d次幂,再做模n运算,即$(m^e)^d\%n=m^\left(ed\right)\%n$。
RSA工作原理推导
为了解开RSA工作原理的神秘面纱,需要使用数论中的一个神奇结论:如果p和q是素数,且有$n=pq$,则$x^y\%n$与$x^\left(y\%\left(p-1\right)\left(q-1\right)\right)\%n$相等。应用这个结论,那我们的私钥解密为:$$(m^e)^d\%n=m^\left(ed\%\left(p-1\right)\left(q-1\right)\right)\%n$$
注意,$m<n$,并且我们是这样选择e和d的:$ed-1$能被$\left(p-1\right)\left(q-1\right)$整除,等价地说$ed\%\left(p-1\right)\left(q-1\right)=1$,由此可得:$$(m^e)^d\%n=m^1\%n=m\qquad m<n,n=pq,ed\%\left(p-1\right)\left(q-1\right)=1,p和q是素数$$
于是乎,就得到了我们希望的结果:先对m做e次幂(加密)再做d次幂(解密),然后做模n的算数运算,就可得到原始报文m。另外通过颠倒上述公式的加解密次序,一样能得到原来的m。
$$(m^e)^d\%n=m=(m^d)^e\%n\Rightarrow K_B^-(K_B^+(m))=m=K_B^+(K_B^-(m))$$
因此B对外公开的公钥$K_B^+$为二元组$(n,e)$,私钥$K_B^-$为二元组$(n,d)$
举例验证
条件:$$m<n,\quad n=pq,\quad ed\%\left(p-1\right)\left(q-1\right)=1,\quad p和q是素数$$
取简单的值:$$p=5,\quad q=7$$
那么可以推导出:$$n=pq=5*7=35,\quad (ed-1)\%(p-1)(q-1)=0\Rightarrow (ed-1)\%(5-1)(7-1)=0\Rightarrow (ed-1)\%24=0$$
于是,我们可以简单起见,为了减少计算量,设$ed-1$为$24$的1倍,那么我们可取值$$e=5,\quad d=5$$
假设传输明文为:$$m=3$$
那么综上所述,我们可以得出:
加密,$m^e\%n=3^5\%35=33$
解密,$(m^e\%n)^d\%n=33^5\%35=3=m$,因此对RSA加密后的密文解密得到的就是原始的明文
iOS 越狱应用安全-潘君
- 对ipa砸壳
- class-dump 导出头文件
- 头文件导入project方便查看
- 善用Xcode的搜索找需要hook的函数
- hook函数完成不可告人的目的
参考资料
网络安全 - 张超耀
主要特性
保密性
- 信息不泄露给非授权用户、实体或过程,或供其利用的特性。
完整性
- 数据未经授权不能进行改变的特性。即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。
可用性
- 可被授权实体访问并按需求使用的特性。即当需要时能否存取所需的信息。例如网络环境下拒绝服务、破坏网络和有关系统的正常运行等都属于对可用性的攻击;
可控性
- 对信息的传播及内容具有控制能力。
可审查性
- 出现安全问题时提供依据与手段
主要类型
网络安全由于不同的环境和应用而产生了不同的类型。主要有以下几种:
系统安全
- 运行系统安全即保证信息处理和传输系统的安全。它侧重于保证系统正常运行。避免因为系统的崩演和损坏而对系统存储、处理和传输的消息造成破坏和损失。避免由于电磁泄翻,产生信息泄露,干扰他人或受他人干扰。
网络的安全
- 网络上系统信息的安全。包括用户口令鉴别,用户存取权限控制,数据存取权限、方式控制,安全审计。安全问题跟踩。计算机病毒防治,数据加密等。
信息传播安全
- 网络上信息传播安全,即信息传播后果的安全,包括信息过滤等。它侧重于防止和控制由非法、有害的信息进行传播所产生的后果,避免公用网络上大云自由传翰的信息失控。
信息内容安全
- 网络上信息内容的安全。它侧重于保护信息的保密性、真实性和完整性。避免攻击者利用系统的安全漏润进行窃听、冒充、诈编等有损于合法用户的行为。其本质是保护用户的利益和隐私。
HTTP加密 -吴明
- 对称性加密
- 加密双方使用同一个密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密
- 常用算法:
- DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES
- 非对称性加密
- 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
- RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
- 对称性加密示例
- sig计算
sig主要用来做校验,由BaseString和SecretKey通过HMAC-SHA1算法计算得到的。 - BaseString 组成
BaseString由以下三部分组成:http方法名、请求url和参数,其中参数需要按照统一的规则进行编码和排序,具体规则如下:
根据参数名称将所有请求参数按照参数名字母的先后顺序逐个比较,进行升序排序(参数名注意区分大小写),然后使用=号连接参数名和编码后的参数值,最后使用_下划线连接经过上述处理后的参数,例如:
注:a、比如参数名:abcdef和abcDef,abc都是一样的,大写D的asi码在小写d的asi码前面,所以:abcDef排在abcdef前面 b、BaseString中的参数是指所有GET/POST的请求参数,但不包括sig参数,也不包括cookie或HTTP header字段 将http方法名、请求url和参数这三部分用”&”连接起来,然后再进行 encode编码即得到BaseString,使用伪代码描述以上过程如下:param1=encode(value1)_param2=encode(value2)_parma3=encode(value3)
然后使用BaseString和SecretKey通过HMAC-SHA1算法计算sig,最后将计算 出的sig进行编码,使用伪代码描述签名过程如下: encode (getHmacSHA1Sig(BaseString, SecretKey)) - sig计算示例 例如某个请求的url为http://192.168.6.218:8080/test/jobplan/login,假设使用的ConsumerKey为eqsrje1tlarvvm54fwsjhcb4,使用的SecretKey为ks5t9fpiwmo3oanccu4f6eas,请求中用到的参数如下:BaseString=encode(httpMethod+"&"+httpUrl+"&"+sorted_query_params.each{|p,v|p+"="+encode(v)}.join("_"))
首先依据上面的算法得出BaseString为:consumer_key – eqsrje1tlarvvm54fwsjhcb4 hrid - 00016145 password - 7215ee9c7d9dc229d2921a40e899ec5f fields - dspName format – xml timestamp - 2013-11-20 09:21:17
通过BaseString和SecretKey通过HMAC-SHA1算法计算所得的签名如下: dqgTQkET7MxSShy1M4WXbWEKodA%3D 然后就可以发送请求,生成的http 请求链接如下:POST%26http%3A%2F%2F192.168.6.218%3A8080%2FfuannaEP%2Fjobplan%2Flogin%26consumer_key%3Deqsrje1tlarvvm54fwsjhcb4_fields%3DdspName_format%3Djson_hrid%3D00016145_password%3D7215ee9c7d9dc229d2921a40e899ec5f_timestamp%3D2013-11-20%2B09%253A21%253A17
http://192.168.6.218:8080/test/jobplan/login?password=7215ee9c7d9dc229d2921a40e899ec5f&consumer_key=eqsrje1tlarvvm54fwsjhcb4&hrid=10057&format=xml&fields=dspName×tamp =2013-11-20 09:21:17&signature=dqgTQkET7MxSShy1M4WXbWEKodA%3D
- sig计算