openresty lua-resty-string md5 sha aes random string

安装 https://github.com/openresty/lua-resty-string

$ sudo opm get openresty/lua-resty-string
$ ls -al /usr/local/openresty/site/lualib/resty/
总用量 100
drwxr-xr-x 3 root root  4096 9月  16 20:47 .
drwxr-xr-x 3 root root  4096 9月   8 07:38 ..
-rw-r--r-- 1 root root  6129 9月  16 20:47 aes.lua
-rw-r--r-- 1 root root  1150 9月  11 19:10 http_headers.lua
-rw-r--r-- 1 root root 29686 9月  11 19:10 http.lua
drwxr-xr-x 2 root root  4096 9月  10 21:32 lrucache
-rw-r--r-- 1 root root  5727 9月  10 21:32 lrucache.lua
-rw-r--r-- 1 root root  1211 9月  16 20:47 md5.lua
-rw-r--r-- 1 root root   616 9月  16 20:47 random.lua
-rw-r--r-- 1 root root  1192 9月  16 20:47 sha1.lua
-rw-r--r-- 1 root root  1045 9月  16 20:47 sha224.lua
-rw-r--r-- 1 root root  1221 9月  16 20:47 sha256.lua
-rw-r--r-- 1 root root  1045 9月  16 20:47 sha384.lua
-rw-r--r-- 1 root root  1359 9月  16 20:47 sha512.lua
-rw-r--r-- 1 root root   236 9月  16 20:47 sha.lua
-rw-r--r-- 1 root root   698 9月  16 20:47 string.lua

可以看出目录下多出了这几个文件:aes.lua md5.lua random.lua sha.lua sha1.lua sha224.lua sha256.lua sha384.lua sha512.lua string.lua

测试文件 test.lua

local resty_sha1 = require "resty.sha1"

local sha1 = resty_sha1:new()
if not sha1 then
    ngx.say("failed to create the sha1 object")
    return
end

local ok = sha1:update("hello, ")
if not ok then
    ngx.say("failed to add data")
    return
end

ok = sha1:update("world")
if not ok then
    ngx.say("failed to add data")
    return
end

local digest = sha1:final()  -- binary digest

local str = require "resty.string"
ngx.say("sha1: ", str.to_hex(digest))
    -- output: "sha1: b7e23ec29af22b0b4e41da31e868d57226121c84"

local resty_md5 = require "resty.md5"
local md5 = resty_md5:new()
if not md5 then
    ngx.say("failed to create md5 object")
    return
end

local ok = md5:update("hel")
if not ok then
    ngx.say("failed to add data")
    return
end

ok = md5:update("lo")
if not ok then
    ngx.say("failed to add data")
    return
end

local digest = md5:final()

local str = require "resty.string"
ngx.say("md5: ", str.to_hex(digest))
    -- yield "md5: 5d41402abc4b2a76b9719d911017c592"

local resty_sha224 = require "resty.sha224"
local str = require "resty.string"
local sha224 = resty_sha224:new()
ngx.say(sha224:update("hello"))
local digest = sha224:final()
ngx.say("sha224: ", str.to_hex(digest))

local resty_sha256 = require "resty.sha256"
local str = require "resty.string"
local sha256 = resty_sha256:new()
ngx.say(sha256:update("hello"))
local digest = sha256:final()
ngx.say("sha256: ", str.to_hex(digest))

local resty_sha512 = require "resty.sha512"
local str = require "resty.string"
local sha512 = resty_sha512:new()
ngx.say(sha512:update("hello"))
local digest = sha512:final()
ngx.say("sha512: ", str.to_hex(digest))

local resty_sha384 = require "resty.sha384"
local str = require "resty.string"
local sha384 = resty_sha384:new()
ngx.say(sha384:update("hel"))
ngx.say(sha384:update("lo"))
local digest = sha384:final()
ngx.say("sha384: ", str.to_hex(digest))

local resty_random = require "resty.random"
local str = require "resty.string"
local random = resty_random.bytes(16)
    -- generate 16 bytes of pseudo-random data
ngx.say("pseudo-random: ", str.to_hex(random))

local resty_random = require "resty.random"
local str = require "resty.string"
local strong_random = resty_random.bytes(16,true)
    -- attempt to generate 16 bytes of
    -- cryptographically strong random data
while strong_random == nil do
    strong_random = resty_random.bytes(16,true)
end
ngx.say("random: ", str.to_hex(strong_random))

local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_md5 = aes:new("AKeyForAES")
    -- the default cipher is AES 128 CBC with 1 round of MD5
    -- for the key and a nil salt
local encrypted = aes_128_cbc_md5:encrypt("Secret message!")
ngx.say("AES 128 CBC (MD5) Encrypted HEX: ", str.to_hex(encrypted))
ngx.say("AES 128 CBC (MD5) Decrypted: ", aes_128_cbc_md5:decrypt(encrypted))

local aes = require "resty.aes"
local str = require "resty.string"
local aes_256_cbc_sha512x5 = aes:new("AKeyForAES-256-CBC",
    "MySalt!!", aes.cipher(256,"cbc"), aes.hash.sha512, 5)
    -- AES 256 CBC with 5 rounds of SHA-512 for the key
    -- and a salt of "MySalt!!"
    -- Note: salt can be either nil or exactly 8 characters long
local encrypted = aes_256_cbc_sha512x5:encrypt("Really secret message!")
ngx.say("AES 256 CBC (SHA-512, salted) Encrypted HEX: ", str.to_hex(encrypted))
ngx.say("AES 256 CBC (SHA-512, salted) Decrypted: ",
    aes_256_cbc_sha512x5:decrypt(encrypted))

local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_with_iv = assert(aes:new("1234567890123456", nil, aes.cipher(128,"cbc"), {iv="1234567890123456"}))
    -- AES 128 CBC with IV and no SALT
local encrypted = aes_128_cbc_with_iv:encrypt("Really secret message!")
ngx.say("AES 128 CBC (WITH IV) Encrypted HEX: ", str.to_hex(encrypted))
ngx.say("AES 128 CBC (WITH IV) Decrypted: ", aes_128_cbc_with_iv:decrypt(encrypted))

测试

$ resty test.lua
sha1: b7e23ec29af22b0b4e41da31e868d57226121c84
md5: 5d41402abc4b2a76b9719d911017c592
true
sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193
true
sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
true
sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
true
true
sha384: 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f
pseudo-random: 4c1f6d82cba1d0441b8f96c6cc0a8183
random: 5558eeac062e63c4304c40532129d9de
AES 128 CBC (MD5) Encrypted HEX: 6d87d6b11c6bf0dcb76d1aa611520b3c
AES 128 CBC (MD5) Decrypted: Secret message!
AES 256 CBC (SHA-512, salted) Encrypted HEX: 02997c9c6eb26af1a335ed8c11d53df3bf127086ecbba02fb73391bcf385bd2c
AES 256 CBC (SHA-512, salted) Decrypted: Really secret message!
AES 128 CBC (WITH IV) Encrypted HEX: f9fa30df0325a7680327842c6a232e7838f7149d80cb8a669cf503a45afc2fa5
AES 128 CBC (WITH IV) Decrypted: Really secret message!