python模块app登陆认证(M2Crypto数字证书加密)
需求:
1、通过数字证书,非对称加密方式传送对称秘钥给服务端
2、用户名、密码使用对称秘钥加密,发送服务端验证
3、传送数据使用字节流方式
实现思路:
1、了解python的struct模块,用于字节流组件保温
2、安装 M2Crypto 模块,此模块依赖第三方软件swig、openssl
M2Crypto 模块安装步骤(centos6.5环境)
1、安装python2.7.10
yum -y install openssl openssl-devel ncurses-devel.x86_64 bzip2-devel sqlite-devel python-devel zlib libcurl-devel
tar zxvf Python-2.7.10.tgz
mkdir -p /usr/local/python/2.7.10/lib
./configure --enable-shared --prefix=/usr/local/python/2.7.10 LDFLAGS="-Wl,-rpath /usr/local/python/2.7.10/lib"
make
make install
mv /usr/bin/python /usr/bin/python2.6.6
ln -fs /usr/local/python/2.7.10/bin/python2.7 /usr/bin/python
2、配置yum调用python版本
vi /usr/bin/yum
修改成!/usr/bin/python2.6.6
安装 setuptools、pip
3、配置环境变量
export PATH=$PATH:/usr/local/python/2.7.10/bin:/usr/local/pcre/bin:/usr/local/swig3.0.7/bin
export LD_LIBRARY_PATH=/lib:/usr/local/pcre/lib/
4、安装PCRE
下载地址:http://www.pcre.org/
./configure --prefix=/usr/local/pcre
make
make install
ln -s /usr/local/pcre/lib/libpcre.so.1 /lib
5、安装swig
下载地址:http://www.swig.org/download.html
./configure --prefix=/usr/local/swig3.0.7
make
make install
6、安装M2Crypto
下载地址:https://pypi.python.org/pypi/M2Crypto/0.22.5
cp /usr/include/openssl/opensslconf-x86_64.h ./
python setup.py install
struc模块说明
struct模块中最重要的三个函数是pack(), unpack(), calcsize()
pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)
unpack(fmt, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
calcsize(fmt) 计算给定的格式(fmt)占用多少字节的内存
struct中支持的格式如下表:
Format | C Type | Python | 字节数 |
x | pad byte | no value | 1 |
c | char | string of length 1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | integer or long | 4 |
l | long | integer | 4 |
L | unsigned long | long | 4 |
q | long long | long | 8 |
Q | unsigned long long | long | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | string | 1 |
p | char[] | string | 1 |
P | void * | long |
注1.q和Q只在机器支持64位操作时有意思
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节
为了同 c 中的结构体交换数据,还要考虑有的 c 或 c++ 编译器使用了字节对齐,通常是以 4 个字节为单位的 32 位系统,故而 struct 根据本地机器字节顺序转换 . 可以用格式中的第一个字符来改变对齐方式 . 定义如下:
Character | Byte order | Size and alignment |
@ | native | native 凑够 4 个字节 |
= | native | standard 按原字节数 |
< | little-endian | standard 按原字节数 |
> | big-endian | standard 按原字节数 |
! | network (= big-endian) | standard 按原字节数 |
使用方法是放在 fmt 的第一个位置,就像 '@5s6sif'
数字证书加密代码
1 from M2Crypto import X509, EVP, RSA, ASN1, BIO 2 3 def random_key(): 4 # 随机秘钥(8位) 5 checkcode = '' 6 for i in range(8): 7 current = random.randrange(0, 8) 8 if current != i: 9 temp = chr(random.randint(65, 90)) 10 else: 11 temp = random.randint(0, 9) 12 checkcode += str(temp) 13 return checkcode 14 15 key = random_key() 16 encrypted_key = RSA.load_pub_key("rsa_public.key") 17 encrypted = encrypted_key.public_encrypt(key, RSA.pkcs1_padding) View Code
M2Crypto 使用 http://www.heikkitoivonen.net/m2crypto/api/
字节流组包代码
1 def header(body,datasize,isprocess,processsize,msgId): 2 #结构体包头 3 #ZipHeader 4 datasize_len = datasize 5 isprocess_num = isprocess 6 processsize_len = processsize 7 datasize = struct.pack('i', datasize_len) 8 isprocess = struct.pack('h', isprocess_num) 9 processsize = struct.pack('i', processsize_len) 10 ZipHeader = datasize+isprocess+processsize+body 11 12 #RequestHeader 13 pkgSize_len = len(ZipHeader) 14 msgId = msgId 15 ownerId = 0 16 magicId = 0 17 RequestHeader = struct.pack('3Ih%ds' % pkgSize_len, pkgSize_len, msgId, ownerId, magicId, ZipHeader) 18 return RequestHeader View Code
字节流参考博客:http://blog.csdn.net/jrckkyy/article/details/38816565