0

Wi-Fi ネットワークに接続する Lua プログラムがあります。Wi-Fi パスワードは Lua コードにハードコーディングされています。NodeMCU ファームウェアで動作する ESP8266 に Lua コードを配置しました。

ここに画像の説明を入力

私が使用するコードは次のとおりです。

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 アドレスを登録できる場合は、パスワードを取得するだけでは Wi-Fi ネットワークに接続できないため、もう 1 つのセキュリティ レイヤーが提供されます。これはパスワードを保護していません! これを行うには、AP を構成する必要があります。

もう 1 つの方法: これには、より多くのコードが必要になります。安全性が高いとは言えませんが、発見が難しくなります。これを使用するには、lua ファイルをコンパイルする必要があります。パスワードを ssid で XOR し、xor したバージョンをコードに入れるだけです。ネットワークを調査し、ネットワークごとにパスワードを作成します。作成されたパスで全員を接続してみてください。一致するペアは正常に接続されます。他は失敗します。これにより、接続シーケンスが少し長くなります。

--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 だけでなくハードウェアも必要になりますが、マシンが物理的に侵害された場合でも「スヌープ」することができます。これは、データ スコープを使用して回路をプローブすることによって可能です。

リバースエンジニアリングに関する他の警告でカバーされていない答え、または「できない」という答えの少なくとも一部があります。

厳密に言えば: (私はこの分野で数十年働いてきた者としてこれを言います) 「モノのインターネット」タイプのデバイスを、それ自体の「IoT」に接続されていない公的にアクセス可能な場所に置くべきではありません。本当にアクセスポイント。これはやり過ぎのように聞こえるかもしれませんが (簡単なテストだけであればそうなるでしょう)、リバース エンジニアリングが行われる可能性から身を守る唯一の方法です。

もちろん、そのアクセス ポイント ネットワークをホームの「プライベート」ネットワークからファイアウォールで保護し、DMZ ネットワーク マシンを使用して「モノ」と通信する必要があります。IPCopディストリビューションのようなものを実行している、いくつかのNICを備えた予備の古いPCは、これをかなり簡単で比較的安価にします.

ただし、同じネットワーク上で別のアクセス ポイントとパスワードの組み合わせを使用するだけでも、その AP でより厳格なポリシーを適用できます。

繰り返しますが、これはあなたのユースケースではやり過ぎのように思えるかもしれません。簡単なテスト状況では同意しますが、ネットワーク セキュリティに真剣に取り組み、Things を解放したい場合は、長期的にはより良い方法です。

余談ですが、将来のホーム オブ シングスがスキルやハードウェアを追加しなくてもその機能を備えられるように、ホーム AP/ルーターにこのような機能がすぐに組み込まれる必要があると感じています。

于 2015-12-21T09:03:17.093 に答える
1

どんな種類のパスワード暗号化と Lua コンパイルも、あいまいさによるセキュリティです (したがって、セキュリティはありません)。

Lua コードにパスワードをまったく入力せず、実行時にパスワードを設定することをお勧めします。少なくとも 3 つのオプションがあります。

注意: これにより、ソース コードにパスワードを配置することは回避されますが、ブラウザーからパスワードが送信されるときに ESP への接続が暗号化されない(SSL を実行できない)ため、わずかなリスクが生じます。

于 2015-12-13T13:00:57.650 に答える