webrtc-ios 编译流程及问题解决

Webrtc 编译

注1:本文档适用webrtc-ios源码的下载和编译;

注2:下载编译所使用的操作系统为mac 终端;

下载编译工具

Chromium和Chromium OS统一使用一个叫做depot_tools的工具的对其源码进行checkout的管理(这有点类似于Android使用repo工具对其源码进行管理一样),作为Chromium其中一个子模块的webrtc而言,也是使用这个工具对其代码进行checkout。这个depot_rools包里面包含了gclient、gcl、git-cl、repo等工具。

下载depot_tools工具包并放到标准路径PATH上:
首先确保mac上安装了Git 2.2.1以上版本,以及Python 2.7以上版本;

1
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

GmSSL 添加新算法

最近在做的工作需要给 GMSSL 密码库添加自有的加密算法和 ssl 算法。因此对 GMSSL 做了一些研究,GMSSL 是 OpenSSL 的 一个分支,它增加了包括 SM2、SM3、SM4在内的国密算法,以及国密的 SSL 加密信道,加密套件为 ECDSA-SM2-SM3-SM4。

增加算法头文件

算法头文件中包括了我们需要添加的加密算法和 ssl 算法。

具体需要在include/openssl 目录下新建文件 new_header.h

在 new_header.h 中定义新的加密算法和 ssl 算法。内容大致如下:

1
2
int new_crypto();
int new_ssl();

Python import 问题

##Python import 遇到的几个问题

python 作为一个脚本语言,具有很多优良的特性,笔者最喜欢的大概是他丰富的函数库,同时在工作中自己也会开发一些库来使用,这样就会经常用到 import 功能。譬如我们有如下两个文件:

1
2
#bar.py
bar_var=1

1
2
3
#foo.py
from bar import bar_var
foo_var=1

在 foo.py 中我们引入了 bar 中的 bar_var 的变量。下面我们介绍 python 引用的机制及常见的问题。

Python import 问题

Java 反序列化任意代码执行漏洞分析与利用

       2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了一个报告[3],报告中介绍了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行。同年11月6日,FoxGlove Security安全团队的@breenmachine在一篇博客中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。
距离漏洞发布已经有了一年多的时间,仍然有很多网站仍未修复漏洞。

1.漏洞原理

1.1 Java序列化与反序列化

       简单的说,把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。

       Java序列化的目的是为了将某些对象存储到磁盘上,从而长期保存,例如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
或者当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
一个序列化与反序列化的典型场景如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class deserial {
public static void main(String args[]) throws Exception {
String obj = "hello world!";

// 将序列化对象写入文件object.db中
FileOutputStream fos = new FileOutputStream("object.db");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(obj);
os.close();

// 从文件object.db中读取数据
FileInputStream fis = new FileInputStream("object.db");
ObjectInputStream ois = new ObjectInputStream(fis);

// 通过反序列化恢复对象obj
String obj2 = (String)ois.readObject();
System.out.println(obj2);
ois.close();
}
}

MD5 算法介绍

       MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

       MD5算法具有以下特点:

  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 容易计算:从原数据计算出MD5值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  4. 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

       MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

PBKDF2介绍

PBKDF2是什么

PBKDF2(Password-Based Key Derivation Function)是一个用来导出密钥的函数,常用于生成加密的密码。

它的基本原理是通过一个伪随机函数(例如HMAC函数),把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生密钥。

如果重复的次数足够大,破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。

破解PBKDF2生成的密码要多久

image

上图是14年在一台多GPU的高端PC上进行的测试,可以看到,在4个单词(随机从Diceware列表选择)的情况下,如果每秒能猜2万个密码,则要猜出密码平均需要2890年。如果密码的长度再高点,则这个时间是天文数字了。

Nginx+uWSGI+Django 配置

前言

       我们在使用 Django 开发的时,测试过程中通常使用 Django 自带的 web 服务器,并设置 Debug=False,这样可以实时修改代码并更新程序。但是在生产环境中通常使用 Nginx+uWSGI+Django 这样的模式。

       在这种模式中,使用 Nginx 作为最前端 web 服务器,它接收所有请求并统一管理所有请求。然后 Nginx 将所有的非静态请求通过 uWSGI发送给 Django 处理,Django 处理返回结果由 uWSGI 发给 Nginx,并返回给用户。可见,uWSGI的作用就类似一个桥接器。起到桥梁的作用。

不使用Nginx,只使用uWSGI+Django也是可以实现WEB服务的。uWSGI也可以直接处理WEB请求

如何在 Django 中设置静态文件

背景

在使用 Django 建设网站的过程中通常需要提供其他一些静态文件,例如 css,js,img 等,然而众所周知,django 无法像 apache 或者 iis 一样直接放上去就可以用,成为了众多新手的一大门槛,笔者也是被折磨了多次。花了一上午时间深入研究了 Django 相关官方文档,记录下来顺便整理一下。

静态文件提供的两种方式

Django 提供了 django.contrib.staticfiles 来帮助用户管理静态文件。

APP 内部文件

  1. 确保django.contrib.staticfiles 在 settting 文件的 INSTALLED_APPS中
  2. 在 setting 文件中,定义变量 STATIC_URL
    STATIC_URL = ‘/static/‘
  3. 在 my_site/my_app/目录下新建文件夹static/my_app/ 然后在其下面存放文件 myexample.jpg文件
  4. 在模板中使用的时候,可以有两种使用方式

    1. 硬编码
      直接硬编码为/static/my_app/myexample.jpg 这样。注意,Django 会查找所有 app 目录下的static/my_app 文件夹,例如你有两个 app,my_app1,my_app2
      目录结构如下:
      my_app1
      -static
      —my_app
      —–myexample.jpg
      my_app2
      -static
      —my_app
      —–myexample.jpg

    那么这样使用的时候,会直接使用第一个目录下的文件

    1. 软编码
      也可以使用 static 模板标签来根据相对路径生成 url.

全局文件

Django查找静态文件的顺序问题

首先会查找各个 app 下面的 STATIC_URL 文件所指定的目录

命名空间 namespace 的问题

测试环境中使用

生产环境中使用