Configurações de Credenciais de QR Code

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:

Fluxograma Exemplo Cadastro QR Code Cifrado

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

paramtypedescription
setConfig *StringComando para cadastrar configuração
keyTimestampChave 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

paramtypedescription
getConfig *StringComando para obter configuração
QRCodeDecodeTimestampQRCodeDecode

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

paramtypedescription
setConfig *StringComando para realizar configuração
EnableTimestampHabilita/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)