Lua功能模块之“加密”
作者:糖果
在Lua开发的世界中,有很多开源的模块,分布在一些网站(比如开普勒项目),github上,有的都已经配置好了,可以向python的pip工具一样,只不过在lua世界中使用luarocks安装工具快速的安装。
我们在开发的工作中,难免要对一些数据进行加密处理,而加密模块的使用有是就必不可少。
在lua官方的WIKI列表中就列出了,很多lua程序写的加密库,这写加密库有的是用纯lua写的,也有用lua调用C的程序实现加密。不过有些时候甄选这些库还是需要花一些时间精力,只是需要测试一下这是加密算是否是好用的
这是lua组织列出的一览列表。
http://lua-users.org/wiki/CryptographyStuff
说一下为什么要加密,我们面临的任务是什么!我们现在面临的任务是,要对一段字符串进行sha256算法加密。
我们从列表中选出了几个支持sha256加密的包,并说明一下这几个工具包。
1.SecureHashAlgorithm和SecureHashAlgorithmBW
这个工具包是支持sha256加密的,而且是纯lua方法的实现,问题是,这两个包分别依赖lua5.2和lua5.3。
而我们系统的运行环境是lua5.1,因为大部分的生产环境都是lua5.1,因为历史原因暂时没法改变。如果要把5.2的程序移植到5.1下运行,还需要移植一个lua5.2才独有的包,这是lua5.2升级之后才有的部件:bit32,而在lua5.3中又将这个部件去掉了,移植的动力不大,暂时不使用这个包。
2.Lcrypt
这个包不是纯lua的实现,底层加密用的是C语言,而且额外还有依赖另外另个工具包 libTomCrypt和libTomMath,这两个包的官网已经被和谐了,github上有源码,所以要想让这个包正常运行需要手动make安装3个源码工程,还是算了,有时间的时候再装好测试一下,先暂时不用。
网站:http://www.eder.us/projects/lcrypt/
3.LuaCrypto
这个包的安装用的是luarocks,就比较简单了 luarocks install luacrypto ,我们选用这个包进行加密处理。
LuaCrypto其实是openssl库的前端lua调用,依赖openssl,openssl库显然会支持sha256加密,相对也比一般的第三方实现更可靠。
写一个简单的加密程序:
local crypto = require("crypto")
local hmac = require("crypto.hmac")
local ret = hmac.digest("sha256", "abcdefg", "hmackey")
print(ret)
ret的返回结果是,如下这个字符串。
704d25d116a700656bfa5a6a7b0f462efdc7df828cdbafa6fbf8b39a12e83f24
我们需要改造一下代码,在调用digest的时候指定输出的形式是raw二进制数据形式,然后在编码成base64的数据形式。
local ret = hmac.digest("sha256", "abcdefg", "hmackey",rawequal)
print(ret)
这时候的输出结果是:
cE0l0RanAGVr+lpqew9GLv3H34KM26+m+/izmhLoPyQ=
lua-base64使用的是下面的库,lua库就是这样,有很多功能程序有很多的实现,并且很多非官方的第三方实现。
https://github.com/toastdriven/lua-base64
=============================================================
同样的我们再写一个php的测试程序:
<?php
$ret = hash_hmac('sha256', 'abcdefg', 'hmackey', false);
print($ret)
?>
ret的返回结果是,如下这个字符串。
704d25d116a700656bfa5a6a7b0f462efdc7df828cdbafa6fbf8b39a12e83f24
没有确认php的hash_hamc是否底层调用的也是openssl的加密算法,至少从目前的测试结果来看,两种语言加密返回的结果是一致的。
我们同样需要改造一下php代码的调用加密的方式:
<?php
$ret = hash_hmac('sha256', 'abcdefg', 'hmackey', true);
print($ret)
?>
函数调用的最后一个参数,true表示用raw二进制形式输出,false是以16进制字符串的形式输出。
最后的结果是:
cE0l0RanAGVr+lpqew9GLv3H34KM26+m+/izmhLoPyQ=
=============================================================
我们测试一下python的sha256加密:
import hmac
import base64
import hashlib
ret = base64.b64encode(hmac.new('hmackey', 'abcdefg', hashlib.sha256).digest())
print(ret)
最后的输出结果是:
cE0l0RanAGVr+lpqew9GLv3H34KM26+m+/izmhLoPyQ=
通过这次测试我们会发现,lua的库很多都是第三方程序员实现的,并且有很多的实现版本,而php和python的库,相对更统一。
如果你真的花了时间去了解lua,能驾驭lua,可以有精力去解决前期遇到的问题,排除库的匹配查找的问题,lua处理的效率会慢慢的展现出来,在之后我们会举出例子来说明lua的好处和不足。
作者:糖果
PS:转载到其它平台请注明作者姓名及原文链接。