REST로 SESAME의 수박 키를 조금 안전하게

SESAME의 API는 훌륭하지만,,,



sesame mini를 샀다. 그리고 SESAME의 Blog( htps : // 아메 bぉ. jp / kan dy 호세 인 c / 엔 try 12413908790. HTML )로 소개되고 있던 라즈파이&SUICA의 조합으로 움직이고 있었습니다. 이 녀석은 훌륭합니다. 현관 앞에 NFC 리더 붙인 라즈파이를 두면 스마트폰 앱을 시작하는 번거로움도 필요 없다. 아이폰을 구덩이 잡는 것만으로 수박을 읽고 열쇠가 열립니다.

다만 어느 날 눈치챘습니다. 이것, 여러가지 중요한 정보가 평문으로 들어가 있지요,,,

조금이라도 안전하게



보안은 이제 안쪽이 너무 깊어서 나에게는 매우 손이 닿지 않습니다.
적어도 밖에 있는 라즈파이에 중요한 정보가 평문이라는 것만 어떻게 하자. 그렇다고 생각한 것이 이하. 우리 집에는 실내에도 nature remo 대신 라즈파이가 가동하고 있기 때문에 그 녀석을 이용합니다.


REST를 사용하고 싶었습니다.



이번 RasberryPi 간의 정보 교환은 REST를 사용해 보았습니다. SESAME의 API도 REST이고, 나 자신 일로 RESTREST 연호하고 있기 때문에 사용하고 싶었습니다.
참고로 한 것은 이쪽
htps : // 이 m / 모리 니키 · ms / c2 a f4 180856d1bf30

이제 프로그래밍



이번에는 두 대의 라즈파이에 각각 서버 프로그램과 클라이언트 프로그램이 필요합니다.

라즈파이 집안쪽



REST와 SESAME Blog를 강아지입니다.
SUICA의 Idm이 일치하지 않는 경우는 404, 여기는 적당한 어택을 피하기 위해서 지연을 넣는 편이 좋은 것일지도.

suikagi-takunai.py
# -*- coding: utf-8 -*-
from flask import Flask, jsonify, abort, make_response

import requests
import json


# login CANDY HOUSE account and get token
url = "https://api.candyhouse.co/v1/accounts/login"
head = {"Content-type": "application/json"}
payload = {"email":"[email protected]", "password":"abcd"}
response = requests.post(url, headers=head, data=json.dumps(payload))
token = response.json()["authorization"]

api = Flask(__name__)

@api.route('/getIdm/<string:userId>', methods=['GET'])
def get_idm(userId):

    if (userId == "0139XXXXXXXXXXXX") or (userId == "0139XXXXXXXXXXXX"):
        result = 'OK' + userId
        print result

        # unlock Sesame with token
        url_control = "https://api.candyhouse.co/v1/sesames/XXXXXXXXXXX/control"
        head_control = {"X-Authorization": token, "Content-type": "application/json"}
        payload_control = {"type":"unlock"}
        response_control = requests.post(url_control, headers=head_control, data=json.dumps(payload_control))

    else :
        abort(404)

    return make_response(jsonify(result))

@api.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
    api.run(host='192.168.XXX.XXX', port=XXXX)

Linux계라면 CURL사용하면 간단하게 디버그할 수 있습니다. 과연 REST.
curl -i http://192.168.XXX.XXX:XXXX/getIdm/YYYYYY

라즈파이 현관 밖



이전 sesameBlog를 기반으로 라즈파이를 nfc 인식하도록 설정하십시오.
htps : // 아메 bぉ. jp / kan dy 호세 인 c / 엔 try 12413908790. HTML

그래서 블로그 페이지의 코드를 개조

suikagi-genkan.py
# -*- coding: utf-8 -*-
import requests
import binascii
import nfc
import time
from threading import Thread, Timer


# Suica待ち受けの1サイクル秒
TIME_cycle = 1.0
# Suica待ち受けの反応インターバル秒
TIME_interval = 0.2
# タッチされてから次の待ち受けを開始するまで無効化する秒
TIME_wait = 3

# NFC接続リクエストのための準備
# 212F(FeliCa)で設定
target_req_suica = nfc.clf.RemoteTarget("212F")
# 0003(Suica)
target_req_suica.sensf_req = bytearray.fromhex("0000030000")

print 'Waiting for SUICA...'
while True:
    # USBに接続されたNFCリーダに接続してインスタンス化
    clf = nfc.ContactlessFrontend('usb')
    # Suica待ち受け開始
    # clf.sense( [リモートターゲット], [検索回数], [検索の間隔] )
    target_res = clf.sense(target_req_suica, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)

    if target_res != None:
        tag = nfc.tag.activate_tt3(clf, target_res)
        tag.sys = 3

        #IDmを取り出す
        idm = binascii.hexlify(tag.idm)

        #REST用のurlを生成
        url = "http://192.168.XXX.XXX:XXXX/getIdm/" + idm

        response = requests.get(url)
        print(response.text)

        print 'sleep ' + str(TIME_wait) + ' seconds'
        time.sleep(TIME_wait)
    #end if

    clf.close()

#end while

앞으로



문장에서도 깜짝 썼습니다만 이대로는 idm은 하기부터 시험될 수 있기 때문에, idm가 부정했을 때에 지연시키는 구조라든지, 밖의 라즈파이의 스테이터스를 LED로 표시하거나라든지 시키고 싶습니다.

좋은 웹페이지 즐겨찾기