Lua功能模块之“加密”

2.5k 词

作者:糖果

在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:转载到其它平台请注明作者姓名及原文链接。

http://www.lua.ren