技术文章

接口的安全机制(上)

5. 接口的安全机制

目录:

5.1 用户认证Auth

5.2 用户签名Sign

5.3 基础密码学知识

5.4 AES加密接口测试

5.1 用户认证Auth

目录:

5.1.1 get_course_list接口文档

5.1.2 用户认证Auth接口测试

5.1.3 Postman中的用户认证

5.1.4 用户认证Auth的缺点

有时,我们会遇到项目的接口需要用户认证,需要注意的是这和用户登录不是一回事,而是将用户账号和密码作为请求Request的参数传递给服务器。

5.1.1 get_course_list接口文档

这里以查询课程接口为例:

   接口的安全机制
接口的安全机制

5.1.2 用户认证Auth接口测试

Requests库的get()和post()方法都有auth参数,用于用户认证Auth

下面是针对get_course_list查询课程列表接口编写的测试用例代码:

get_course_sec_auth.py

         接口的安全机制
接口的安全机制
接口的安全机制

5.1.3 Postman中的用户认证

这种用户认证Auth对应Postman中Authorization中的Basic Auth

 接口的安全机制

5.1.4 用户认证Auth的缺点

这种认证方式是最简单的认证方式,客户端发送的认证Auth信息会以明文方式发送到服务器端,十分不安全,很容易被截获和读取。

下图是Fiddler中的抓包信息,直接读出了Auth的账号和密码。

 接口的安全机制

5.2 用户签名Sign

目录:

5.2.1 鉴权

5.2.2 数据防篡改

5.2.3 add_course添加课程接口文档

5.2.4 用户签名Sign接口测试

使用用户签名Sign作为传递的参数作用主要是:鉴权和数据防篡改

5.2.1 鉴权

作用:

通过客户端的密钥和服务器端的密钥匹配

举例:

假设接口传参为: http://127.0.0.1:8000/api/?a=1&b=2

密钥为:@admin123

加上密钥的接口传参为:http://127.0.0.1:8000/api/a=1&b=2&sign=@admin123

但是一般明文传输sign签名是不安全的,一般会通过加密算法加密,比如MD5:

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

简单解释,MD5算法可以产生数据或文件的一个独一无二的“数字指纹”,我们通过比对这个“数字指纹”是否一致就可以验证用户或文件是否被改动。

 接口的安全机制

将"@admin123"加密之后得到:4b9db269c5f978e1264480b0a7619eea

所以,MD5加密后带签名的接口为:http://127.0.0.1:8000/api/a=1&b=2&sign=4b9db269c5f978e1264480b0a7619eea

md5算法是不可逆的。所以当服务器接收到参数后,需要同样对"@admin123"进行MD5加密,与传入的sign加密字符串比较是否一致,从来鉴别调用者是否有权访问接口。

鉴权的缺点

通过数据中sign参数传递密钥的方式比明文传输密钥要安全,但是也有缺点,可以被截包之后获取MD5加密后的密钥,替换掉请求中的部分参数。

例如:http://127.0.0.1:8000/api/?a=2&b=3&sign=4b9db269c5f978e1264480b0a7619eea

5.2.2 数据防篡改

作用:

数据防篡改就是将接口参数和密钥一起生成加密字符串,将整个参数和密钥的加密字符串作为签名Sign

举例:

接口传参为:http://127.0.0.1:8000/api/?a=1&b=2

假设密钥为:@admin123

加上签名之后的接口明文传参为:http://127.0.0.1:8000/api/?a=1&b=2&sign=@admin123

通过md5算法将整个接口参数:a=1&b=2&sign=@admin123 生成加密字符串:967f838b7fd09759f064fddc5f296479

加密后带签名的接口为:http://127.0.0.1:8000/api/a=1&b=2&sign=967f838b7fd09759f064fddc5f296479

全参加密:

因为是对整个接口的参数都进行了加密,所以只要任意一个参数发生变化,签名验证就会失败,起到了鉴权和对数据完整性的保护。

缺点:

因为md5不可逆,所以服务器必须要知道客户端的接口参数和值,否则签名验证会失败。但是在设计接口的时候客户端的请求参数并不完全已知。

5.2.3 add_course添加课程接口文档

这里以添加课程接口为例:

   接口的安全机制
接口的安全机制

5.2.4 用户签名Sign接口测试

add_course_sec_sign_test.py

  接口的安全机制
接口的安全机制
接口的安全机制
接口的安全机制
接口的安全机制
接口的安全机制
接口的安全机制
接口的安全机制               

这里使用了时间戳+密钥的方式加密,如果服务器时间-客户端时间<60秒允许接口访问,否则抛错 10003用户sign timeout

将时间戳和密钥 &HZDLedu.com 一起作为签名,发送给服务器端,由服务器端以相同方式计算sign值,若相等并其它参数都正确返回 10020 ,若sign值不等则返回 10004 用户sign error

以上我们都用的MD5加密,但是MD5算法在1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。