【问题标题】:Storing intermediary result in a temporary variable in lua openresty gives a different result将中间结果存储在 lua openresty 中的临时变量中会产生不同的结果
【发布时间】: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

标签: lua openresty


【解决方案1】:

encode_base64 有第二个参数,它打开无填充模式。所以我认为你的随机函数返回第二个真实值。我建议尝试将其称为ngx.encode_base64((random.bytes(32))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多