28/07/2017, 10:47
(Questo messaggio è stato modificato l'ultima volta il: 30/07/2017, 11:46 da Walter Vergara.
Motivo modifica: foto del circuito
)
Ciao a tutti,
vorrei condividere con voi questo semplice progetto, ovvero una serratura con controllo OTP (one-time-password) tramite lettore QR. E' una prima versione funzionante, ma vorrei migliorarlo il più possibile, si accettano quindi idee e consigli!
Hardware:
- Pi3
- PiCamera
- Serratura (solenoide 12V)
- Relay 5V
- Alimentatore/Batteria 12V
Circuito:
Per alimentare il solenoide ho usato 8 batterie alcaline da 1.5 ciascuna.
Software:
- Raspbian Jessie + Apache2 + PHP
- Libreria PHP per algoritmo OTP: https://github.com/lelag/otphp
- Libreria Python imaging: https://pypi.python.org/pypi/Pillow/
- Libreria Python scan QR: http://zbar.sourceforge.net/
Funzionamento:
- Tramite una web app (server remoto) su smartphone genero un codice TOTP codificato come QR via javascript (https://davidshimjs.github.io/qrcodejs/)
- Mostro il QR alla camera -> decodifico
- Calcolo il TOTP e lo confronto con il QR decodificato per determinare l'apertura della serratura.
Sia sul server remoto che sul rasp gira la stessa versione di PHP, la libreria OTP è la medesima e ovviamente anche il token per generare il codice OTP. Inoltre il codice subisce un hashing (sha256) di PHP prima dell'utilizzo.
Routine Python:
Generatore codice TOTP in PHP:
Come già detto è una versione base funzionante. Obiettivi:
- Aumentare la velocità lettura QR
- Migliorare affidabilità/sicurezza
- Trovare bug
vorrei condividere con voi questo semplice progetto, ovvero una serratura con controllo OTP (one-time-password) tramite lettore QR. E' una prima versione funzionante, ma vorrei migliorarlo il più possibile, si accettano quindi idee e consigli!
Hardware:
- Pi3
- PiCamera
- Serratura (solenoide 12V)
- Relay 5V
- Alimentatore/Batteria 12V
Circuito:
Per alimentare il solenoide ho usato 8 batterie alcaline da 1.5 ciascuna.
Software:
- Raspbian Jessie + Apache2 + PHP
- Libreria PHP per algoritmo OTP: https://github.com/lelag/otphp
- Libreria Python imaging: https://pypi.python.org/pypi/Pillow/
- Libreria Python scan QR: http://zbar.sourceforge.net/
Funzionamento:
- Tramite una web app (server remoto) su smartphone genero un codice TOTP codificato come QR via javascript (https://davidshimjs.github.io/qrcodejs/)
- Mostro il QR alla camera -> decodifico
- Calcolo il TOTP e lo confronto con il QR decodificato per determinare l'apertura della serratura.
Sia sul server remoto che sul rasp gira la stessa versione di PHP, la libreria OTP è la medesima e ovviamente anche il token per generare il codice OTP. Inoltre il codice subisce un hashing (sha256) di PHP prima dell'utilizzo.
Routine Python:
Codice:
import RPi.GPIO as GPIO
from PIL import Image
import zbar
import picamera
import time
import requests
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
camera = picamera.PiCamera()
while True:
camera.capture('image.jpg')
scanner = zbar.ImageScanner()
scanner.parse_config('enable')
pil = Image.open('image.jpg').convert('L')
width, height = pil.size
raw = pil.tostring()
image = zbar.Image(width, height, 'Y800', raw)
scanner.scan(image)
for symbol in image:
print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data
r = requests.get("http://localhost/otp")
if symbol.data == r.text:
print 'opening'
GPIO.output(12, GPIO.LOW)
time.sleep(7)
print 'closing'
GPIO.output(12, GPIO.HIGH)
else:
print 'invalid code'
del(image)
Generatore codice TOTP in PHP:
Codice:
<?php
date_default_timezone_set('Europe/Rome');
require('vendor/libs.php');
require('lib/otp.php');
require('lib/totp.php');
$totp = new \OTPHP\TOTP("token");
echo hash('sha256',$totp->now());
?>
Come già detto è una versione base funzionante. Obiettivi:
- Aumentare la velocità lettura QR
- Migliorare affidabilità/sicurezza
- Trovare bug