0

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

在此处输入图像描述

这是我使用的代码:

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 代码会改变什么吗?
4

4 回答 4

3

(更新)

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

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

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

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

--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
于 2015-12-14T10:52:04.450 回答
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 放弃密码可能并非不可能,但无论您如何尝试混淆,这肯定比将其存储在代码中要困难得多。

于 2016-03-10T06:41:04.067 回答
1

我还考虑使用 I2C EEPROM 来存储密钥,因此任何妥协还需要硬件,而不仅仅是 Lua/Flash,但如果机器物理受到损害,即使是这样也能够被“窥探”,正如我想象的那样通过用数据示波器探测电路可能会出现这种情况。

有一个答案,或者至少是“你不能”的答案的一部分,这在逆向工程的其他警告中没有涵盖:

严格来说:(我是作为在该领域工作了几十年的人这么说的)你不应该把任何“物联网”类型的设备放在一个没有连接到自己的“物联网”的公共可访问的地方接入点真的。虽然这听起来像是矫枉过正(如果只是为了一个简短的测试,可能是这样),但这是真正保护自己免受逆向工程发生可能性的唯一方法。

然后,您当然应该使用 DMZ 网络机器从您的家庭“私有”网络防火墙访问该接入点网络,以便与“事物”进行通信。一台带有几个 NIC 的备用旧 PC,运行 IPCop 发行版之类的东西,使这变得相当简单且相对便宜。

但即使只是在同一网络上使用不同的接入点/密码组合,也可以对该 AP 实施更严格的策略

同样,这对于您的用例来说似乎有点过头了,我同意在快速测试情况下,但是如果您对网络安全很认真并且想要释放这些东西,那么这是更好的方法 - 长期。

作为旁注:我确实觉得家庭 AP/路由器需要尽快内置类似的东西,这样未来的物联网之家就可以在没有额外技能或硬件的情况下拥有这种能力。

于 2015-12-21T09:03:17.093 回答
1

任何形式的密码加密和 Lua 编译都是隐蔽的安全性(因此没有安全性)。

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

注意:虽然这避免了将密码放在源代码中,但它会带来轻微的风险,因为从浏览器发送密码时与 ESP 的连接没有加密(不能执行 SSL)。

于 2015-12-13T13:00:57.650 回答