Momenteel ontwikkel ik (een soort van) embedded software.
Ik zeg "een soort van", omdat het officieel niet embedded is;
Het is een app, geschreven in HTML / JS met een Cordova-wrapper (die zorgt er voor dat de "app" functioneert binnen een platform-agnostische browserview).
Feitelijk bouw je dus een soort mini-website, maar heb je (dankzij Cordova) wel toegang tot hardware API's van de device waarop alles draait (al is dat in dit geval niet van belang).
De app wordt uiteindelijk geïnstalleerd op een x-aantal tablets (Android 4, 5 / 6 en Windows 10 (phone / tablet).
Al deze devices zijn fysiek niet toegankelijk, behalve het touch-screen; de hardware-buttons zijn simpelweg fysiek gesloopt, of op andere wijze ontoegankelijk gemaakt (speciale case, die bv. de tablets in een soort teflar-rubbed hoesje plaatst).
Kortom; de software draait in een app - op een device dat enkel een touchscreen kent.
Via de touchscreen kan men keuzes maken - deze keuzes worden geregistreerd en lokaal opgeslagen in de local-storage (HTML5 equivalent van een cookie) van de app.
Nadat de data is opgeslagen, wordt er via HTTPS verbinding gemaakt (over een afgesloten en beveiligd WIFI kanaal) met een remote-server.
De app stuurt (via AJAX) vervolgens de data naar server - en nu komt het...
...ik wil de data niet als plain-text verzenden; het is weliswaar niet privacy-gevoelig, maar beter safe than sorry.
Om die reden heb ik gezocht naar een basis-vorm van encryptie; ik ben echter beperkt tot wat de app op lokaal niveau kan doen;
De app is 100% javascript, qua functionaliteit - dus ik kan geen PHP / ASP / .NET encryption libraries aanroepen.
Nu heb ik een encryptie-methode gevonden (open source) die als volgt werkt;
Je hebt een private-key, bv "4!2#3A~f_:qXa" - en die is voor alle devices hetzelfde (de app wordt universeel uitgerold, dus elke device ontvangt dezelfde app én dus dezelfde "private-key".
Tegelijk kan de operator (via het touch-screen) een extra key invoeren, die dus wel per device anders is; "~$$Xa_fa?3".
Dit levert dus een sleutel op, van (bv.) 32 tekens (deels uniek per device, deels shared - maar de volledige key is altijd uniek).
Met deze key kan ik de data versleutelen. De data bevat een eenvoudige, numerieke array van gestures / swipes / touches op het touchscreen, bv [1, 2, 16, 3, 5, 1, 5 , 4].
Het gaat dus om deze string die naar de server verzonden moet worden, en het liefst dus encrypted. Via de encryptie-library levert bovenstaande array iets op als dit;
KQ7QgfewNxsgtY15xKv6f+eqGtMxNQFvjwrTF7QmfaN8bK8O7usQp5cYpShZt0hTtXZhjeCplTo149bXC/ylmr9IPVP6sGCIIUaTUsQJzBbE8+qcd/wqvEvVK78lDmZtaS2oBrZEd9UV4Qk15iPp1S11VMBLVgu7yfhhT7RUbmlPbLSJQ9BVhDy3Sd5OmR86htonIw==
Aan de kant van de server kan men die string weer decrypten, door zowel de private-key als universal-key te mergen en deze string er door heen te halen.
Als er ook maar één van de 32 tekens uit de sleutel niet klopt - levert het een onleesbare string op, dus de key moet 100% matchen met de afzender.
Het werkt perfect... maar hoe veilig is deze werkwijze?
Overigens kan ik natuurlijk wel melden welke encryption-library ik gebruikt heb - maar ik wil eerst zo neutraal mogelijk achterhalen of bovenstaande string überhaupt (met enkel de vermelde kennis) gebroken kan worden.
Je kan natuurlijk de tablet fysiek van de muur rukken, de .APK / .XAP er uit zien te pulken - deze decompilen, het standaardwachtwoord achterhalen, proberen om het unieke wachtwoord te achterhalen (dat kan enkel via het touchscreen, als je binnen x-seconden een pattern van 16 swipes doet in een unieke volgorde), etc...
Ik heb het idee, dat als je bovenstaande string al kan achterhalen (networksniffer, lekke database, etc...) maar je de volledige key niet kent - het toch redelijk secure is?
Natuurlijk, het blijft javascript - dus zowel key als encryptie zitten "in" de app, maar door omstandigheden kan dit niet anders.
Het gaat hier ook niet om Fort Knox-data, anders zou ik het niet eens uitgevoerd hebben - maar ik wil het wel zo veilig mogelijk verzenden allemaal...
Overigens worden de apps niet via de stores gedistribueerd, maar via gesloten kanalen en worden ze op afgesloten plekken op de devices gezet. Deze worden daarna gesealed en nog voorzien van extra software die alles locked (je kan op geen enkele manier buiten de app komen, de devices restarten, het OS benaderen, etc...).
- edit - De app wordt geïnstalleerd bij een klant, die vervolgens zijn / haar klanten de app laat gebruiken om informatie te achterhalen.
Dus de klanten van de klant voeren de data in (via het touchscreen), de klant zelf ontvangt deze weer (via een dashboard aan de kant van de server).
De klant zelf mag de data natuurlijk wel inzien, het gaat er meer om dat de klanten van de klant / toevallige passanten die fysiek toegang tot de tablet hebben, niet ongezien alle data kunnen uitlezen / sniffen / opvangen / etc...
Ik zeg "een soort van", omdat het officieel niet embedded is;
Het is een app, geschreven in HTML / JS met een Cordova-wrapper (die zorgt er voor dat de "app" functioneert binnen een platform-agnostische browserview).
Feitelijk bouw je dus een soort mini-website, maar heb je (dankzij Cordova) wel toegang tot hardware API's van de device waarop alles draait (al is dat in dit geval niet van belang).
De app wordt uiteindelijk geïnstalleerd op een x-aantal tablets (Android 4, 5 / 6 en Windows 10 (phone / tablet).
Al deze devices zijn fysiek niet toegankelijk, behalve het touch-screen; de hardware-buttons zijn simpelweg fysiek gesloopt, of op andere wijze ontoegankelijk gemaakt (speciale case, die bv. de tablets in een soort teflar-rubbed hoesje plaatst).
Kortom; de software draait in een app - op een device dat enkel een touchscreen kent.
Via de touchscreen kan men keuzes maken - deze keuzes worden geregistreerd en lokaal opgeslagen in de local-storage (HTML5 equivalent van een cookie) van de app.
Nadat de data is opgeslagen, wordt er via HTTPS verbinding gemaakt (over een afgesloten en beveiligd WIFI kanaal) met een remote-server.
De app stuurt (via AJAX) vervolgens de data naar server - en nu komt het...
...ik wil de data niet als plain-text verzenden; het is weliswaar niet privacy-gevoelig, maar beter safe than sorry.
Om die reden heb ik gezocht naar een basis-vorm van encryptie; ik ben echter beperkt tot wat de app op lokaal niveau kan doen;
De app is 100% javascript, qua functionaliteit - dus ik kan geen PHP / ASP / .NET encryption libraries aanroepen.
Nu heb ik een encryptie-methode gevonden (open source) die als volgt werkt;
Je hebt een private-key, bv "4!2#3A~f_:qXa" - en die is voor alle devices hetzelfde (de app wordt universeel uitgerold, dus elke device ontvangt dezelfde app én dus dezelfde "private-key".
Tegelijk kan de operator (via het touch-screen) een extra key invoeren, die dus wel per device anders is; "~$$Xa_fa?3".
Dit levert dus een sleutel op, van (bv.) 32 tekens (deels uniek per device, deels shared - maar de volledige key is altijd uniek).
Met deze key kan ik de data versleutelen. De data bevat een eenvoudige, numerieke array van gestures / swipes / touches op het touchscreen, bv [1, 2, 16, 3, 5, 1, 5 , 4].
Het gaat dus om deze string die naar de server verzonden moet worden, en het liefst dus encrypted. Via de encryptie-library levert bovenstaande array iets op als dit;
KQ7QgfewNxsgtY15xKv6f+eqGtMxNQFvjwrTF7QmfaN8bK8O7usQp5cYpShZt0hTtXZhjeCplTo149bXC/ylmr9IPVP6sGCIIUaTUsQJzBbE8+qcd/wqvEvVK78lDmZtaS2oBrZEd9UV4Qk15iPp1S11VMBLVgu7yfhhT7RUbmlPbLSJQ9BVhDy3Sd5OmR86htonIw==
Aan de kant van de server kan men die string weer decrypten, door zowel de private-key als universal-key te mergen en deze string er door heen te halen.
Als er ook maar één van de 32 tekens uit de sleutel niet klopt - levert het een onleesbare string op, dus de key moet 100% matchen met de afzender.
Het werkt perfect... maar hoe veilig is deze werkwijze?
Overigens kan ik natuurlijk wel melden welke encryption-library ik gebruikt heb - maar ik wil eerst zo neutraal mogelijk achterhalen of bovenstaande string überhaupt (met enkel de vermelde kennis) gebroken kan worden.
Je kan natuurlijk de tablet fysiek van de muur rukken, de .APK / .XAP er uit zien te pulken - deze decompilen, het standaardwachtwoord achterhalen, proberen om het unieke wachtwoord te achterhalen (dat kan enkel via het touchscreen, als je binnen x-seconden een pattern van 16 swipes doet in een unieke volgorde), etc...
Ik heb het idee, dat als je bovenstaande string al kan achterhalen (networksniffer, lekke database, etc...) maar je de volledige key niet kent - het toch redelijk secure is?
Natuurlijk, het blijft javascript - dus zowel key als encryptie zitten "in" de app, maar door omstandigheden kan dit niet anders.
Het gaat hier ook niet om Fort Knox-data, anders zou ik het niet eens uitgevoerd hebben - maar ik wil het wel zo veilig mogelijk verzenden allemaal...
Overigens worden de apps niet via de stores gedistribueerd, maar via gesloten kanalen en worden ze op afgesloten plekken op de devices gezet. Deze worden daarna gesealed en nog voorzien van extra software die alles locked (je kan op geen enkele manier buiten de app komen, de devices restarten, het OS benaderen, etc...).
- edit - De app wordt geïnstalleerd bij een klant, die vervolgens zijn / haar klanten de app laat gebruiken om informatie te achterhalen.
Dus de klanten van de klant voeren de data in (via het touchscreen), de klant zelf ontvangt deze weer (via een dashboard aan de kant van de server).
De klant zelf mag de data natuurlijk wel inzien, het gaat er meer om dat de klanten van de klant / toevallige passanten die fysiek toegang tot de tablet hebben, niet ongezien alle data kunnen uitlezen / sniffen / opvangen / etc...
[ Voor 5% gewijzigd door b2vjfvj75gjx7 op 10-06-2016 13:48 . Reden: Werksituatie toegevoegd (klant, klanten, etc...). ]