1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| local resty_rand = require "resty.openssl.rand" local resty_sha1 = require "resty.sha1" local strupper = string.upper local strchar = string.char local concat = table.concat
local bn = require "resty.openssl.bn"
local ngx = ngx local ngx_log = ngx.log
local function gen_salt()
return resty_rand.bytes(32) end
local function Hexstr_to_bytes(str) local tab = {} for i=#str-1,1,-2 do tab[#tab+1] = strchar(tonumber(str:sub(i,i+1),16)) end return concat(tab) end
local bn_g = bn.from_binary(strchar(7)) local bn_N = bn.from_binary(Hexstr_to_bytes("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"))
local function gen_verifier(username, password) local salt = gen_salt()
ngx_log(ngx.ERR, "salt: ", salt) ngx_log(ngx.ERR, "strupper username: ", strupper(username)) ngx_log(ngx.ERR, "strupper password: ", strupper(password))
local sha1_np = resty_sha1:new() sha1_np:update(strupper(username)) sha1_np:update(":") sha1_np:update(strupper(password))
local digest = sha1_np:final()
ngx_log(ngx.ERR, "digest: ", digest)
local sha1_vf = resty_sha1:new() sha1_vf:update(salt) sha1_vf:update(digest) local verifier = sha1_vf:final()
ngx_log(ngx.ERR, "verifier: ", verifier)
local bn_v = bn.from_binary(verifier) local bn_r = bn_g:mod_exp(bn_v, bn_N); return salt, bn_r:to_binary(32) end
return { gen_verifier = gen_verifier }
|