网络信息安全

微信支付的网络安全 - 王胜

协议规则

  • 采用HTTPS传输
  • POST提交
  • MD5签名,请求和接收数据均需要校验签名,详见
  • 调用申请退款、撤销订单接口需要商户证书

安全规范

  • 签名算法
    1. 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
    2. 在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
2
客户端 - 网络传输 - API
key, 加密(签名)算法 sign=md5(key+url_path+time)

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和参数,其中参数需要按照统一的规则进行编码和排序,具体规则如下:
      根据参数名称将所有请求参数按照参数名字母的先后顺序逐个比较,进行升序排序(参数名注意区分大小写),然后使用=号连接参数名和编码后的参数值,最后使用_下划线连接经过上述处理后的参数,例如:
      
      param1=encode(value1)_param2=encode(value2)_parma3=encode(value3)
      
      注:a、比如参数名:abcdef和abcDef,abc都是一样的,大写D的asi码在小写d的asi码前面,所以:abcDef排在abcdef前面 b、BaseString中的参数是指所有GET/POST的请求参数,但不包括sig参数,也不包括cookie或HTTP header字段 将http方法名、请求url和参数这三部分用”&”连接起来,然后再进行 encode编码即得到BaseString,使用伪代码描述以上过程如下:
      
      BaseString=encode(httpMethod+"&"+httpUrl+"&"+sorted_query_params.each{|p,v|p+"="+encode(v)}.join("_"))
      
      然后使用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,请求中用到的参数如下:
      
      consumer_key – eqsrje1tlarvvm54fwsjhcb4
      hrid - 00016145
      password - 7215ee9c7d9dc229d2921a40e899ec5f
      fields - dspName
      format – xml
      timestamp - 2013-11-20 09:21:17
      
      首先依据上面的算法得出BaseString为:
      
      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
      
      通过BaseString和SecretKey通过HMAC-SHA1算法计算所得的签名如下: dqgTQkET7MxSShy1M4WXbWEKodA%3D 然后就可以发送请求,生成的http 请求链接如下:
      
      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