我有一个连接到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密码。
答案 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) )。