QR Code
Atualmente é suportada a opção para a utilização do QR Code em modo criptografado e não criptografado.
Modo Criptografado
Este modo não expõe a credencial do usuário e utiliza um timestamp para validar o QR code, inibindo cópias e utilização de QR codes antigos. Este modo é habilitado por padrão, deve ser utilizado na geração do QR Code por meio do seguinte algoritmo:
import base64
import time
import qrcode
from Crypto.Cipher import AES
class IntelbrasQREnc(object):
def __init__(self, key):
self.key = key.encode('utf-8')
self.iv = int(0).to_bytes(16, byteorder='big')
def encrypt(self, cardNrHexStr):
# convert cardNr string to bytes (4 bytes)
cardNrHex = int(cardNrHexStr,16).to_bytes(4, byteorder='big')
# get the epoch unix time (4 bytes)
timeEpochHex = (int(time.time())).to_bytes(4, byteorder='big')
print("Used epochTime: ", int.from_bytes(timeEpochHex, byteorder='big', signed=True))
# concatenate timeEpoch and CardNr
toEnc = timeEpochHex + cardNrHex
# create the cipher object
cipher = AES.new(self.key, AES.MODE_OFB, self.iv)
# Encrypt the data
enc = cipher.encrypt(toEnc)
# encode the encrypted data with base64
base64enc = base64.b64encode(enc)
# Concatenate prefix string
return str(base64enc, 'utf-8')
# key must be 32 chars string with printable chars (utf-8)
key = '0123456789ABCDEF0123456789ABCDEF'
# Card number must be in string in Hex, maximum value "FFFFFFFF", 32bits
cardNr = "4401964D"
print("Encrypting:...")
print("CardNr to enc: ", cardNr)
# Create the IntelbrasQREnc object
QREnc = IntelbrasQREnc(key)
# Create the encrypted message from card
qrcodeStr = QREnc.encrypt(cardNr)
print("Encoded string: ", qrcodeStr)
print("\n")
# Generate qrcode image from crypted data
img = qrcode.make(qrcodeStr)
type(img) # qrcode.image.pil.PilImage
img.save("qrcode.png")
Passos para utilização
1º - Cadastrar Chave de Segurança no Dispositivo (deve conter 32 caracteres ou 265 bits)
2º - Cadastrar número cartão do usuário no dispositivo (hexadecimal)
3º - Gerar QR code com hash do número do cartão e a senha de segurança (utilizando algoritmo em python).
Fluxograma de exemplo:
Usuário Visitante:
O acesso é limitado pela validade da credencial do usuário, pela quantidade de acesso permitido. O Cadastro do usuário visitante é feito pela utilização do paramêtro UserType
durante o cadastro do usuário, sendo UserType=2 o usuário do tipo visitante.
Usuário Comum: O acesso é limitado pela validade da credencial do usuário, zona de tempo, timeout de 10 minutos após a geração do QR code. O Cadastro do usuário normal é feito pela utilização do paramêtro UserType durante o cadastro do usuário, sendo UserType=0 o usuário do tipo normal.
Obs: Neste modo é necessário que o relógio do dispositivo esteja correto.
Cadastrar Chave de Segurança
Por meio desta opção é realizado o cadastro da chave de segurança ao dispositivo que realizará a leitura do QRcode com criptografia.
Obs: Esta chave deve ser gerada e única para cada cenário e não deve ser compartilhada
Requisição - GET
http://192.168.1.201/cgi-bin/configManager.cgi?action=setConfig&QRCodeDecode.key=6PNKDVQEU6YOULVYDDJW2SISEBNVUOPU
param | type | description |
---|---|---|
setConfig * | String | Comando para cadastrar configuração |
key | Timestamp | Chave do QRcode, deve ser no máximo 32 caracteres. |
Exemplo de Retorno - text/plain
OK
Obter Chave de Segurança
Obs: Esta chave deve ser gerada e única para cada cenário e não deve ser compartilhada
Requisição - GET
http://192.168.1.201/cgi-bin/configManager.cgi?action=getConfig&name=QRCodeDecode
param | type | description |
---|---|---|
getConfig * | String | Comando para obter configuração |
QRCodeDecode | Timestamp | QRCodeDecode |
Exemplo de Retorno - text/plain
table.QRCodeDecode.cipher=0
table.QRCodeDecode.key=6PNKDVQEU6YOULVYDDJW2SISEBNVUOPu
Exemplos
import requests
device_ip = '10.1.35.144'
username = 'admin'
password = 'acesso1234'
url = "http://{}/cgi-bin/configManager.cgi?action=getConfig&name=QRCodeDecode".format(
str(device_ip),
)
digest_auth = requests.auth.HTTPDigestAuth(username, password)
rval = requests.get(url, auth=digest_auth, stream=True, timeout=20, verify=False)
print(rval.text)
Alterar Tipo de QR Code
Ao Habilitar o QRcode sem segurança, qualquer cartão cadastrado no dispositivo, é passível de ser lido via QRcode e será realizado a abertura da porta de acordo com as regras do cadastro.
Requisição - GET
http://192.168.1.201/cgi-bin/configManager.cgi?action=setConfig&_EnableUnsecure_.Enable=true
param | type | description |
---|---|---|
setConfig * | String | Comando para realizar configuração |
Enable | Timestamp | Habilita/Desabilita a segurança do QRcode |
Exemplo de Retorno - text/plain
OK
Exemplos
import requests
device_ip = '10.1.35.144'
username = 'admin'
password = 'acesso1234'
url = "http://{}/cgi-bin/configManager.cgi?action=setConfig&_EnableUnsecure_.Enable=true".format(
str(device_ip),
)
digest_auth = requests.auth.HTTPDigestAuth(username, password)
rval = requests.get(url, auth=digest_auth, stream=True, timeout=20, verify=False)
print(rval.text)