如何防止WiFi密码泄露Lua代码?

时间:2015-12-12 19:02:48

标签: lua esp8266 nodemcu

我有一个连接到wifi网络的Lua程序。 wifi密码在Lua代码中是硬编码的。我将Lua代码放在运行在NodeMCU固件上的ESP8266上。

enter image description here

以下是我使用的代码:

wifi.setmode(wifi.STATION)
wifi.sta.config("SSID", "password")
wifi.sta.connect()

srv = net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(conn, payload)
        print(payload)
        local response = "HTTP/1.1 200 OK\r\n\r\n<h1> Hello, NodeMcu.</h1>"
        conn:send(response, function()
            conn:close()
        end)
    end)
end)

当我将此设置用于室外传感器时,任何人都可以抓住ESP8266,阅读Lua脚本并获取我的WiFi密码。

  1. 是否有地方用Lua加密ESP8266上的密码?
  2. 是否可以使用一些外部加密单元?
  3. 编译过的Lua代码会改变什么吗?

3 个答案:

答案 0 :(得分:3)

(更新)

在Lua代码中,物理访问没有安全性。除了其他答案:ESP有一个保存wifi设置的选项。因此,这将允许您不将凭证放入lua文件中。对凭据进行一次编程,然后删除凭据代码。这将使得获取凭据变得有点困难。至少有一个读取代码的人不会看到它。 (但由于this,当然不是一个完整的安全选项。) 每当esp重新启动或wifi网络在范围内时,它将连接到相同的ssid和网络。默认情况下处于启用状态。

wifi.setmode(wifi.STATION)
wifi.sta.config("SSID", "password")
wifi.sta.connect()

另一种方法是mac地址注册。如果您的AP允许您注册站点的mac地址,那么它将提供一层安全性,因为获取密码将不足以连接wifi网络。这不保证您的密码!您需要配置AP来执行此操作。

还有一种方法: 这将需要更多代码。我不能说它更安全,但它会让它更难发现。你应该编译你的lua文件来使用它。只需使用ssid对您的密码进行异或,并将xor&#ed; ed版本放入您的代码中。调查网络并为每个网络创建密码。尝试将每个人与制作的传球联系起来。匹配对将成功连接。其他人将失败。这将使连接顺序更长一些。

--encode
--retuns a table containing bytes
--also prints what should be in code
-- s is ssid, p is password
function encode(s,p)    
    key = s..s --encoding key, must be longer than password 
    enc = {} --new table
    uart.write(0,"Key output: {")

    for i=1,string.len(p) do        
        c = bit.bxor(p:byte(i),key:byte(i))
        table.insert(enc,c)     
        if i == string.len(p) then
            uart.write(0,c.."}")
        else 
            uart.write(0,c..",")
        end
    end 
    return enc
end

--decode
--tries to decode password with table enc
--s is ssid (got from survey) encval is byte table
function decode(s,encval)
    key=s..s
    pass=""
    for ii,i in ipairs(encval) do
        c = bit.bxor( key:byte(ii),i)
        pass = pass..string.char(c)
    end
    print("password: "..pass) 
    return pass
end

-- lets say ssid="network" and password="psswrd12"
encodedpass = encode("network","psswrd12")
-- this will print: Key output: {30,22,7,0,29,22,90,92}
-- this will be included in code
-- and to decode
print(decode("network",encodedpass))
-- will print: password: psswrd12

答案 1 :(得分:2)

连接ESP8266内部存储密码后,您不需要重新连接,只需省略密码参数或传递nil即可。

我将所有运行时设置存储在一个名为settings.lua的文件中,如下所示:

cfg.WiFiAP = "myAP"
cfg.WiFiPwd = "*****"

我将它加载到init.lua中的全局表中,如下所示:

cfg = {}
dofile("settings.lua")

当我初始化WiFi时,我会检查密码是否为零。如果不是,我用它连接,将其设置为nil,然后覆盖设置文件:

if cfg.WiFiPwd ~= nil then
    wifi.sta.config(cfg.WiFiSSID, cfg.WiFiPwd, 0)
    cfg.WiFiPwd = nil
    require("writecfg")()
end

和writecfg.lua看起来像这样:

local module =...
return function()
    print("[writecfg]")
    file.open("settings.lua", "w+")
    for k,v in pairs(cfg) do
        if v == nil then
            v = ""
        end
        local buf = "cfg." .. k .. " = \"" .. v .. "\""
        file.writeline(buf)
        buf = nil
    end
    file.close()
    file.remove("settings.lc")
    package.loaded[module] = nil
    module = nil
end

让ESP8266放弃密码可能不是不可能的,但无论你怎么试图混淆,它肯定比将它存储在代码中困难得多。

答案 2 :(得分:1)

任何类型的密码加密和Lua编译都是默默无闻的安全性(因此没有安全性)。

我建议您不要将密码放在Lua代码中,而是将其设置为运行时。至少有3个选项:

警告:虽然这样可以避免将密码放在源代码中,但它会带来轻微的风险,因为当从浏览器发送密码时,与ESP的连接加密(无法执行SSL) )。