【发布时间】:2020-03-07 03:46:11
【问题描述】:
我遇到了一些非常奇怪的事情,想了解发生了什么。出于某种原因,如果我在 lua 中设置一个临时变量来保存中间结果,我会得到不同的结果。
我有以下代码:
local random = require("resty.random")
local token = ngx.encode_base64(random.bytes(32))
print("len(" .. string.len(token) .. ") " .. token) -- > len(43) OUOoBKfxLZDtE7yrHFzThF2e7dc6Wtjmzz3C6lQC67I
它不返回有效的 base64 字符串。缺少 =,字符串只有 43 个字符。
但如果我执行以下操作,它会起作用
local random = require("resty.random")
local bytes = random.bytes(32)
local token = ngx.encode_base64(bytes)
print("len(" .. string.len(token) .. ") " .. token) -- > len(44) 1E49IwlcsyfIBEwWBRXhTV2eFrc7QyYoFZ0kC1OsuTM=
base64 字符串有效。该字符串为 44 个字符,末尾带有 =。
这可能是什么原因造成的。我很奇怪两个代码之间的结果会不同。我已经确认 mac os x 和 ubuntu 16.04 lts 上的 openresty 1.15.8.2 都是这种情况。
【问题讨论】:
-
可能
random.bytes(32)返回的垃圾回收对象在ngx.encode_base64()(C 编写的函数)完成之前就被垃圾回收了。 -
这可能是
encode_base64问题,因为您生成随机序列并且它取决于输入。你能用固定数据重现这个吗? -
试试
ngx.encode_base64((random.bytes(32)))。可能有第二个返回值和base64产生url安全b64