Slide 1

Slide 1 text

Securing Client-Side Data Andrew Duncan, Co-Founder, SwarmOnline @andrewmduncan andrew@swarmonline.com Wednesday, 25 September 13

Slide 2

Slide 2 text

Wednesday, 25 September 13

Slide 3

Slide 3 text

Why store client-side? Wednesday, 25 September 13

Slide 4

Slide 4 text

Improve performance Wednesday, 25 September 13

Slide 5

Slide 5 text

Make the app work o ine Wednesday, 25 September 13

Slide 6

Slide 6 text

Where can we store our Data? Wednesday, 25 September 13

Slide 7

Slide 7 text

LocalStorage Cookies WebSQL IndexedDB SessionStorage Wednesday, 25 September 13

Slide 8

Slide 8 text

HTML5 Storage is not secure Can we do something about that? Wednesday, 25 September 13

Slide 9

Slide 9 text

HTML5 Storage and Security -Not Encrypted -It can’t be trusted -Don’t store session identifiers -Only cookies can use the httpOnly flag -SessionStorage probably our best option Wednesday, 25 September 13

Slide 10

Slide 10 text

JavaScript can help us... maybe Wednesday, 25 September 13

Slide 11

Slide 11 text

Watch out for libraries not maintained by Cryptographers Wednesday, 25 September 13

Slide 12

Slide 12 text

Crypto-JS -Collection of Security Algorithms -MD5, PBKDF2, AES etc... -Easy to use -https://code.google.com/p/crypto-js/ Wednesday, 25 September 13

Slide 13

Slide 13 text

Stanford JavaScript Crypto Library -Stanford Javascript Crypto Library -AES -http://crypto.stanford.edu/sjcl/ Wednesday, 25 September 13

Slide 14

Slide 14 text

https://github.com/bitwiseshiftleft/sjcl/contributors Still Maintained Wednesday, 25 September 13

Slide 15

Slide 15 text

var encryptedData = sjcl.encrypt('Amsterdam', 'ModUXCon'); //"{ // "iv": "/mx7CEihT3d7SOwwE7xrWA", // "v": 1, // "iter": 1000, // "ks": 128, // "ts": 64, // "mode": "ccm", // "adata": "", // "cipher": "aes", // "salt": "zWAyQczJww4", // "ct": "nyBREOy9jjrMbQARklcvJg" //}" var data = sjcl.decrypt('Amsterdam', encryptedData); //data = "ModUXCon" Wednesday, 25 September 13

Slide 16

Slide 16 text

The users password is a good key, particularly when used with a key derivation function. Wednesday, 25 September 13

Slide 17

Slide 17 text

Override Ext.encode & Ext.decode -Straightforward approach -Useful if ALL JSON is encrypted -Could also write your own extended functions -Ext.JSON.encodeEncrypted() -Ext.JSON.decodeEncrypted() Wednesday, 25 September 13

Slide 18

Slide 18 text

this.encode = function() { var ec; return function(o) { if (!ec) { // setup encoding function on first access ec = isNative() ? JSON.stringify : doEncode; } return ec(o); }; }(); Wednesday, 25 September 13

Slide 19

Slide 19 text

this.encode = function() { var ec; return function(o) { if (!ec) { // setup encoding function on first access ec = isNative() ? JSON.stringify : doEncode; } return sjcl.encrypt('KEY', ec(o)); }; }(); Wednesday, 25 September 13

Slide 20

Slide 20 text

this.decode = function() { var dc; return function(json, safe) { if (!dc) { // setup decoding function on first access dc = isNative() ? JSON.parse : doDecode; } try { return dc(json); } catch (e) { if (safe === true) { return null; } Ext.Error.raise({ sourceClass: "Ext.JSON", sourceMethod: "decode", msg: "You're trying to decode an invalid JSON String: " + json }); } }; }(); Wednesday, 25 September 13

Slide 21

Slide 21 text

this.decode = function() { var dc; return function(json, safe) { if (!dc) { // setup decoding function on first access dc = isNative() ? JSON.parse : doDecode; } try { return sjcl.decrypt('KEY', dc(json)); } catch (e) { if (safe === true) { return null; } Ext.Error.raise({ sourceClass: "Ext.JSON", sourceMethod: "decode", msg: "You're trying to decode an invalid JSON String: " + json }); } }; }(); Wednesday, 25 September 13

Slide 22

Slide 22 text

Overriding The Proxy -Provides more flexibility -Doesn’t have a knock-on effect across the rest of your app -Not all Proxies use JSON (e.g. SQL) Wednesday, 25 September 13

Slide 23

Slide 23 text

getRecord: function(id) { if (this.cache[id] === undefined) { var recordKey = this.getRecordKey(id), item = this.getStorageObject().getItem(recordKey), data = {}, Model = this.getModel(), fields = Model.getFields().items, length = fields.length, i, field, name, record, rawData, rawValue; if (!item) { return undefined; } rawData = Ext.decode(item); ... } return this.cache[id]; } Wednesday, 25 September 13

Slide 24

Slide 24 text

getRecord: function(id) { if (this.cache[id] === undefined) { var recordKey = this.getRecordKey(id), item = this.getStorageObject().getItem(recordKey), data = {}, Model = this.getModel(), fields = Model.getFields().items, length = fields.length, i, field, name, record, rawData, rawValue; if (!item) { return undefined; } rawData = sjcl.decrypt('KEY', Ext.decode(item)); ... } return this.cache[id]; } Wednesday, 25 September 13

Slide 25

Slide 25 text

setRecord: function(record, id) { ... try { obj.setItem(key, Ext.encode(data)); } catch(e){ this.fireEvent('exception', this, e); } record.commit(); } Wednesday, 25 September 13

Slide 26

Slide 26 text

setRecord: function(record, id) { ... try { obj.setItem(key, sjcl.encrypt('KEY', Ext.encode(data))); } catch(e){ this.fireEvent('exception', this, e); } record.commit(); } Wednesday, 25 September 13

Slide 27

Slide 27 text

W3C Web Cryptography Working Group Wednesday, 25 September 13

Slide 28

Slide 28 text

Hybrid App Containers -Filesystem storage -Data Storage Options Wednesday, 25 September 13

Slide 29

Slide 29 text

PhoneGap - Hardware Encryption - limited by platform - Use SQLLite Plugin - SQLCipher - Open Source - 256-bit encryption - http://brodyspark.blogspot.co.uk/ - Don’t store the key - derive from users password Wednesday, 25 September 13

Slide 30

Slide 30 text

RhoMobile -Similar to PhoneGap -Rhom Local Database -SQLite Database -SQLite Encryption Extension (SEE) -All or nothing switch Wednesday, 25 September 13

Slide 31

Slide 31 text

Sencha Space -Secure data stores -Secured LocalStorage -Secure Files API -Remove app access to make the data inaccessible Wednesday, 25 September 13

Slide 32

Slide 32 text

Remote Wiping Data -Use a mobile device management (MDM) suite -AirWatch -Soti MobiControl -Sencha Space Wednesday, 25 September 13

Slide 33

Slide 33 text

Questions? Wednesday, 25 September 13