Top Banner
Zingly, or how to design a multi-banking app Petr Dvorak joshis@tweets Lime
78

mDevCamp 2016 - Zingly, or how to design multi-banking app

Jan 07, 2017

Download

Economy & Finance

Petr Dvořák
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: mDevCamp 2016 - Zingly, or how to design multi-banking app

Zingly, or how to design a multi-banking app

Petr Dvorak joshis@tweets Lime

Page 2: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 3: mDevCamp 2016 - Zingly, or how to design multi-banking app

A big change is comming …

Page 4: mDevCamp 2016 - Zingly, or how to design multi-banking app

PSD2 Legislation

Page 5: mDevCamp 2016 - Zingly, or how to design multi-banking app

Access to account information and

payment service initiation

Page 6: mDevCamp 2016 - Zingly, or how to design multi-banking app

Banking API Server

Multi-Banking Hub Services

Bank A

Ban

ksU

sers

Inte

grat

ors

Banking API Server

Bank B

Banking API Server

Bank C

Page 7: mDevCamp 2016 - Zingly, or how to design multi-banking app

Zingly

Page 8: mDevCamp 2016 - Zingly, or how to design multi-banking app

Simple, faster and more secure

mobile banking for your bank

Page 9: mDevCamp 2016 - Zingly, or how to design multi-banking app

Extra fast login with

PIN or Touch ID

Page 10: mDevCamp 2016 - Zingly, or how to design multi-banking app

Quick account

overview

Page 11: mDevCamp 2016 - Zingly, or how to design multi-banking app

Comprehensive

transaction list

Page 12: mDevCamp 2016 - Zingly, or how to design multi-banking app

Pay your friends

and family

Page 13: mDevCamp 2016 - Zingly, or how to design multi-banking app

Mobile e-commerce

payments (with SDK)

Page 14: mDevCamp 2016 - Zingly, or how to design multi-banking app

Design

Page 15: mDevCamp 2016 - Zingly, or how to design multi-banking app

There is only one chance

to do your app right…

Page 16: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 17: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 18: mDevCamp 2016 - Zingly, or how to design multi-banking app

Showing only the nice things

("dictator rule")

Page 19: mDevCamp 2016 - Zingly, or how to design multi-banking app

Architecture

Page 20: mDevCamp 2016 - Zingly, or how to design multi-banking app

Open-source

Page 21: mDevCamp 2016 - Zingly, or how to design multi-banking app

Architecture

• PowerAuth 2.0 Server

• Zingly API Server

• Zingly Multi-banking Hub

• Zingly Mobile App

Page 22: mDevCamp 2016 - Zingly, or how to design multi-banking app

• Native iOS app (Android later)

• Written in Swift 2.0

• Native PowerAuth 2.0 core (C/C++)

• Cocoapods for library management

Page 23: mDevCamp 2016 - Zingly, or how to design multi-banking app

Zingly server components play nice

with existing banking systems

Page 24: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

Custom API

Bank B

Custom Security and Core Services

SOAP SOAP

REST

REST + WebSockets

Page 25: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0

Page 26: mDevCamp 2016 - Zingly, or how to design multi-banking app

Security

Page 27: mDevCamp 2016 - Zingly, or how to design multi-banking app

What is so hard on mobile banking apps?

Page 28: mDevCamp 2016 - Zingly, or how to design multi-banking app

Multi-banking

• Storing data from multiple banks

• Authentication to multiple banks

• Data transport security

Page 29: mDevCamp 2016 - Zingly, or how to design multi-banking app

3rd parties

• People don’t trust them

• Cannot provide huge guarantees

• Can play no, positive or negative role

Page 30: mDevCamp 2016 - Zingly, or how to design multi-banking app

… back to PowerAuth

Page 31: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 32: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 33: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 34: mDevCamp 2016 - Zingly, or how to design multi-banking app

Mobile libraries soon But I will show you today !

Page 35: mDevCamp 2016 - Zingly, or how to design multi-banking app

Authentication Secure Storage E2E Encryption

Page 36: mDevCamp 2016 - Zingly, or how to design multi-banking app

Authentication

• Secure app activation

• Activation life-cycle

• Multi-factor data signature

Page 37: mDevCamp 2016 - Zingly, or how to design multi-banking app

Authentication How to …

Page 38: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 39: mDevCamp 2016 - Zingly, or how to design multi-banking app
Page 40: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 1: Set up your app

Page 41: mDevCamp 2016 - Zingly, or how to design multi-banking app

• Application key

• Application secret

• Master Public Key

Page 42: mDevCamp 2016 - Zingly, or how to design multi-banking app

#define APP_KEY "QvTX+lSRTNNJ9zAT8bC8iw=="

#define APP_SECRET "1zNNJNgP0RBGCJWuoHwKqw=="

#define APP_MASTER_KEY "BKltWgFa0U0qlef0c9ll3y3E4lGWrFPTBvrB+gv9tQ3wIwI aEeBnonH9HuSo/6eJKhCJcse6wHXQl8bQ="

Page 43: mDevCamp 2016 - Zingly, or how to design multi-banking app

class SecurityContext { let session = PA2Session() static let sharedInstance = SecurityContext() func initSecurityContext() { let setup = PA2SessionSetup() setup.applicationKey = APP_KEY setup.applicationSecret = APP_SECRET setup.masterServerPublicKey = APP_MASTER_KEY self.session.initializeSessionWithSetup(setup) } }

Page 44: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 2: Read the "activation code"

Page 45: mDevCamp 2016 - Zingly, or how to design multi-banking app

XC651-AB231-13891-DE123

Short activation ID Activation OTP

Page 46: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 3: Securely exchange public keys

Page 47: mDevCamp 2016 - Zingly, or how to design multi-banking app

Request - POST: /pa/activation/create

{ "requestObject": { "activationName": "My iPhone", "applicationKey": "UNfS0VZX3JhbmRvbQ==", "activationIdShort": "XDA57-24TBC", "activationNonce": "hbmRvbQRUNESF9QVUJMSUNfS0VZX3J==", "applicationSignature": "SF9QRUNEVUJMSUNfS0VZX3JhbmRvbQ==", "encryptedDevicePublicKey": "RUNESF9QVUJMSUNfS0VZX3JhbmRvbQ==", "extras": "Any custom data in any format (XML, JSON, ...)" } }

Page 48: mDevCamp 2016 - Zingly, or how to design multi-banking app

let session = SecurityContext.sharedInstance.session

let step1Param = PA2ActivationStep1Param() step1Param.activationIdShort = activationIdShort step1Param.activationOtp = activationOtp let step1Result = session.startActivation(step1Param)! // if (session.lastErrorCode == PA2ErrorCode.Ok) { let activationNonce = step1Result.activationNonce let applicationSignature = step1Result.applicationSignature let encryptedDevicePublicKey = step1Result.cDevicePublicKey

Page 49: mDevCamp 2016 - Zingly, or how to design multi-banking app

Response - HTTP 200 - OK

{ "status": "OK", "responseObject": { "activationId": "c564e700-7e86-4a87-b6c8-a5a0cc89683f", "activationNonce": "vbQRUNESF9hbmRQVUJMSUNfS0VZX3J==", "ephemeralPublicKey": "MSUNfS0VZX3JhbmRvbQNESF9QVUJMSUNfS0VZX3JhbmRvbQNESF9QVUJ==", "encryptedServerPublicKey": "NESF9QVUJMSUNfS0VZX3JhbmRvbQNESF9QVUJMSUNfS0VZX3JhbmRvbQ==", "serverDataSignature": "QNESF9QVUJMSUNfS0VZX3JhbmRvbQ==" } }

Page 50: mDevCamp 2016 - Zingly, or how to design multi-banking app

let step2Param = PA2ActivationStep2Param() let response = entity.responseObject step2Param.activationId = response.activationId step2Param.ephemeralNonce = response.activationNonce step2Param.encryptedServerPublicKey = response.encryptedServerPublicKey step2Param.ephemeralPublicKey = response.ephemeralPublicKey step2Param.serverDataSignature = response.serverDataSignature let step2Result = session.validateActivationResponse(step2Param)

if (session.lastErrorCode == PA2ErrorCode.Ok) { // ... continue to next step }

Page 51: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 4: Ask user for a PIN code

Page 52: mDevCamp 2016 - Zingly, or how to design multi-banking app

• Short PIN code (4 digits) can be used

• Check for simple combinations

• Ask user to use Touch ID

Page 53: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 5: Generate keys and get session state

Page 54: mDevCamp 2016 - Zingly, or how to design multi-banking app

// we need keys for three authentication factors ... let possessionKey = session.generateSignatureUnlockKey() let biometryKey = session.generateSignatureUnlockKey()

let unlockKeys = PA2SignatureUnlockKeys() unlockKeys.biometryUnlockKey = biometryKey unlockKeys.possessionUnlockKey = possessionKey unlockKeys.userPassword = PA2Password(string: "1234") session.completeActivation(unlockKeys)

let sessionState = session.serializedState()

Page 55: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 6: Store session and keys to keychain

Page 56: mDevCamp 2016 - Zingly, or how to design multi-banking app

// KeychainAccess for Swift // created by Kishikawa Katsumi // see https://github.com/kishikawakatsumi/KeychainAccess

let keychain = Keychain(service: "com.example.myServiceId")

keychain[data: "PA_SESSION_STATE"] = sessionState keychain[data: "PA_KEY_POSSESSION"] = possessionKey do { try keychain .accessibility( .WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .TouchIDAny ) .set(biometryKey, key: "PA_KEY_BIOMETRY") } catch _ { // Error handling... } }

Page 57: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 6: Complete activation on web

Page 58: mDevCamp 2016 - Zingly, or how to design multi-banking app

12345 67890

Page 59: mDevCamp 2016 - Zingly, or how to design multi-banking app

Step 8: Sign data, make payments, heureka!

!

Page 60: mDevCamp 2016 - Zingly, or how to design multi-banking app

// Initialize session after app launch let sessionState = keychain[data: "PA_SESSION_STATE"] if (sessionState != nil) { self.session.deserializeState(sessionState!) }

PA2SignatureUnlockKeys keys; keys.possessionUnlockKey = keychain[data: "PA_KEY_POSSESSION"]

// ... ask for PIN code keys.userPassword = cc7::MakeRange("1234")

// ... or use TouchID instead of PIN like so // keys.biometryUnlockKey = keychain[data: "PA_KEY_BIOMETRY"];

Page 61: mDevCamp 2016 - Zingly, or how to design multi-banking app

// send data on server with the correct HTTP header let paHeaderName = session.httpAuthHeaderName let paHeaderValue = session.httpAuthHeaderValueForBody( data, httpMethod: "POST", uri: "/account/payment/commit", keys: keys, factor: PA2SignatureFactor_Possession_Knowledge )

Page 62: mDevCamp 2016 - Zingly, or how to design multi-banking app

X-PowerAuth-Authorization: PowerAuth pa_activation_id="7a24c6e9-48e9-43c2-ab4a-aed6270e924d", pa_application_key="Z19gyYaW5kb521fYWN0aXZ==", pa_nonce="kYjzVBB8Y0ZFabxSWbWovY==", pa_signature_type="possession_knowledge" pa_signature="46782479-37298320", pa_version="2.0"

Page 63: mDevCamp 2016 - Zingly, or how to design multi-banking app

That wasn't that hard, right?

Page 64: mDevCamp 2016 - Zingly, or how to design multi-banking app

How about multi-banking?

Page 65: mDevCamp 2016 - Zingly, or how to design multi-banking app

Many banks, one PIN code

Page 66: mDevCamp 2016 - Zingly, or how to design multi-banking app

activation id

PIN(x)

knowledge

Bank A Bank B

activation id

knowledge

Page 67: mDevCamp 2016 - Zingly, or how to design multi-banking app

activation id

PIN(x)

activation id

PIN(x)

knowledge knowledge

Bank A Bank B

Page 68: mDevCamp 2016 - Zingly, or how to design multi-banking app

Authentication Secure Storage E2E Encryption

Page 69: mDevCamp 2016 - Zingly, or how to design multi-banking app

Secure Storage

• Data encrypted with remote key

• Authentication needed

• Enables secure mobile multi-banking

Page 70: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

SOAP SOAP

REST

REST + WebSockets

PowerAuth 2.0 Server

Zingly API Server

Bank B

Internet banking

CoreServices

SOAP SOAP

REST

Page 71: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

SOAP SOAP

REST

REST + WebSockets

PowerAuth 2.0 Server

Zingly API Server

Bank B

Internet banking

CoreServices

SOAP SOAP

REST

PowerAuth 2.0 Server

Page 72: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

SOAP SOAP

REST

REST + WebSockets

PowerAuth 2.0 Server

Zingly API Server

Bank B

Internet banking

CoreServices

SOAP SOAP

REST

PowerAuth 2.0 Server

PowerAuth 2.0 Client

activation id

PIN(x)

activation id

PIN(x)

knowledge knowledge

Page 73: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

SOAP SOAP

REST

REST + WebSockets

PowerAuth 2.0 Server

Zingly API Server

Bank B

Internet banking

CoreServices

SOAP SOAP

REST

PowerAuth 2.0 Server

PowerAuth 2.0 Client

knowledge

activation id

PIN(x)

activation id

PIN(x)

activation id

PIN(x)

knowledge knowledge

Page 74: mDevCamp 2016 - Zingly, or how to design multi-banking app

PowerAuth 2.0 Server

Zingly API Server

Zingly Multi-Banking Hub

Bank A

Internet bankingB

anks

Use

rsZ

ingl

y

CoreServices

SOAP SOAP

REST

REST + WebSockets

PowerAuth 2.0 Server

Zingly API Server

Bank B

Internet banking

CoreServices

SOAP SOAP

REST

PowerAuth 2.0 Server

PowerAuth 2.0 Client SECURE VAULT

knowledge

activation id

PIN(x)

activation id

PIN(x)

activation id

PIN(x)

knowledge knowledge

Page 75: mDevCamp 2016 - Zingly, or how to design multi-banking app

Authentication Secure Storage E2E Encryption

Page 76: mDevCamp 2016 - Zingly, or how to design multi-banking app

That was nice… What's in it for me?

Page 77: mDevCamp 2016 - Zingly, or how to design multi-banking app

• Build secure apps with PowerAuth 2.0

• Mobile e-commerce with Zingly payments

• Use banking API to access banking services

• Steal code, contribute, comment, live! !

Page 78: mDevCamp 2016 - Zingly, or how to design multi-banking app

Thank you!

Petr Dvořák e-mail: [email protected] twitter: @zinglyapp

http://zingly.cz/

Lime