将Django用户的sessiondata从Lua中的base64编码解码。

我正在使用Lua与Redis来从Django项目中获取任何管理员的“sessiondata”。在Django项目中,“sessiondata”被编码成base64形式。

sessiondata的取值为:

session_data =“ NzlmZjZmNWQxMGIzNTQzMDZhNDZjNzJiZGQ4OWZiY2NjNDg0NDVlZTqAAn1xAShVEl9 hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVs QmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAgEKdS4 =”

我的Lua代码解码会话数据是

-从django会话数据中解码base64代码
local b ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ '
local function dec(data)
    data = string.gsub(data,'[ ^'..b..'=]', ''return (data:gsub('。 'M函数(x)
        if(x ==' = 'then return ' 'end
        local r,f =' ',(b: find(x)-1)
       for i = 6.1,-1,-1 do r = r .. (f%2 ^ i-f%2 ^(i-1)> 0 and'1 'or' 0')结束
        返回r;
    结束):gsub('% d%d%d?%d?%d?%d?%d?%d?'M函数(x)
        if(#x〜= 8)then return ' '结束
        local c = 0
        对于i = 1.8 do c = c +(x:sub(i,i)== '1' and 2 ^(8-i)或0)结束
        返回string.char(c)
    结束))
end

当我运行print(dec(session_data))时,我得到了

output = 79ff6f5d10b354306a46c72bdd89fbccc48445ee:'} q(U_auth_user_backendqU)django.contrib.auth.backends.ModelBackendqU_autH_user_id qu。

而输出应该是

{'_auth_user_id'2561L,'_auth_user_backend't:'django.contrib.auth.backends.ModelBackend'}

像Django那样。

请告诉我我做错了什么。

点赞
用户2895784
用户2895784

一次快速的谷歌搜索返回了这篇博客文章

以下是对会话数据解密的(精简版、未验证的)Python 代码:

def decode(session_data, secret_key, class_name='SessionStore'):
    encoded_data = base64.b64decode(session_data)
    utoken, pickled = encoded_data.split(b':', 1)
    return pickle.loads(pickled)

换句话说,你的期望是错误的。未经 base64 解码的数据包含一个校验和哈希值(79ff6...445ee)后跟一个冒号,然后是序列化(通过 pickle)的 Python 数据(�}q(U_auth..._user_idq� u.)。

如果你真的想了解如何解码 Python 选择的数据,请参见PEP 307

2013-12-05 17:18:47
用户471842
用户471842

如果您正在使用 Django 1.5.3+,您可以使用 json serializer 来解决在 Lua 中尝试解码 Python Pickles 的问题;在 Django 1.6+ 中,默认为 Json serializer。

2014-03-03 11:18:00