SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
Autenticação
de Dois Fatores
Ricardo Coelho
@ramcoelho
Autenticar?
Identificar
uma pessoa
de maneira
assertiva
utilizando
uma métrica
mensurável
ou comparável
Fatores?
Cada um dos
diferentes
mecanismos
de identificação
(métricas)
* * *
?
Fatores Comuns
Senha
Biometria
(Impressão Digital)
PIN
Token / SMS / E-mail
Certificado Digital
Bancos
Senha + Token
Bancos
Senha + Token
e-Tokens
e-Tokens
“To cloud or not to cloud”
–Authamlet
Exemplo
Inserção Manual
ou
Leitura de QR Code
Exemplo
Inserção Manual
ou
Leitura de QR Code
Exemplo
Inserção Manual
ou
Leitura de QR Code
One Time Password - OTP
Senhas descartáveis
Exposição apenas do código derivado
Hash de um Segredo + Semente Variável
Conversões e Transformações
OTP
HOTP TOTP
HMAC-BASED
OTP
TIME-BASED
OTP
Hashed Message
Authentication Code
Also HMAC
But time, not counter
HOTP
$secret = ‘4CAF7G34BBGS4CTF’;
$counter++;
$hash = hash(‘sha1’, $secret . $counter);
$code = toDigits($hash, 6);
TOTP
$secret = ‘4CAF7G34BBGS4CTF’;
$time = (int)(time() / 30);
$hash = hash(‘sha1’, $secret . $time);
$code = toDigits($hash, 6);
HOTP vs. TOTP
HOTP não exige sincronização de relógios
TOTP trabalha melhor com janelas
estreitas (mais segurança)
HOTP permite validação bi-direcional
TOTP não perde sincronização por mal uso
Formato e-Token
OTPAuth
OTPAuth
otpauth://totp/usuario@servidor.com
?secret=4CAF7G34BBGS4CTF
&period=30&digits=6
&algorithm=SHA1&issuer=MeuApp
BASE64
46 61 74 6f 72
01000110 01100001 01110100 01101111 01110010
010001 100110 000101 110100 011011 110111 0010
RmF0b3I=
Fator
BASE64
0 - A
1 - B
2 - C
3 - D
4 - E
5 - F
6 - G
7 - H
8 - I
9 - J
10 - K
11 - L
12 - M
13 - N
14 - O
15 - P
16 - Q
17 - R
18 - S
19 - T
20 - U
21 - V
22 - W
23 - X
24 - Y
25 - Z
26 - a
27 - b
28 - c
29 - d
30 - e
31 - f
32 - g
33 - h
34 - i
35 - j
36 - k
37 - l
38 - m
39 - n
40 - o
41 - p
42 - q
43 - r
44 - s
45 - t
46 - u
47 - v
48 - w
49 - x
50 - y
51 - z
52 - 0
53 - 1
54 - 2
55 - 3
56 - 4
57 - 5
58 - 6
59 - 7
60 - 8
61 - 9
62 - +
63 - /
BASE32
Fator
46 61 74 6f 72
01000110 01100001 01110100 01101111 01110010
01000 11001 10000 10111 01000 11011 11011 10010
IZQXI33S
BASE32
0 - A
1 - B
2 - C
3 - D
4 - E
5 - F
6 - G
7 - H
16 - Q
17 - R
18 - S
19 - T
20 - U
21 - V
22 - W
23 - X
24 - Y
25 - Z
26 - 2
27 - 3
28 - 4
29 - 5
30 - 6
31 - 7
8 - I
9 - J
10 - K
11 - L
12 - M
13 - N
14 - O
15 - P
Implementação
$ composer require spomky-labs/otphp
<?php
use OTPHPTOTP;
$otp = TOTP::create();
echo ‘OTP: ’ . $otp->now();
Implementação
$ composer require spomky-labs/otphp
<?php
use OTPHPTOTP;
$otp = HOTP::create();
echo ‘OTP: ’.$otp->now();
Implementação
<?php
use OTPHPTOTP;
$otp = TOTP::create(‘4CAF7G34BBGS4CTF’);
$otp->verify($input);
$ composer require spomky-labs/otphp
OTPAuth
otpauth://totp/usuario@servidor.com
?secret=4CAF7G34BBGS4CTF
&period=30&digits=6
&algorithm=SHA1&issuer=MeuApp
<?php
use OTPHPTOTP;
$totp = TOTP::create(‘4CAF7G34BBGS4CTF’);
$totp->setLabel(‘usuario@servidor.com’);
$totp->getProvisioningUri(),
Implementação
$ composer require bacon/bacon-qr-code
Implementação
<?php
use OTPHPTOTP;
$totp = TOTP::create();
$totp->setLabel(‘usuario@servidor.com’);
$renderer = new BaconQrCodeRendererImagePng();
$renderer->setHeight(256);
$renderer->setWidth(256);
$writer = new BaconQrCodeWriter($renderer);
$writer->writeFile(
$totp->getProvisioningUri(),
‘qrcode.png’
);
otpauth://totp/usuario@servidor.com
?secret=4CAF7G34BBGS4CTF
&period=30&digits=6
&algorithm=SHA1&issuer=MeuApp
Implementação
Jamais ative a autenticação em dois
fatores sem exigir a confirmação do OTP
pelo usuário
Jamais desative também
Implemente um canal alternativo para
entrega do OTP (SMS, e-mail)
OTP vs. Passwords
OTP é limitado em termos de segurança
Senhas têm tamanho variado
Senhas podem nunca expirar
Ambos são baseados em segredo
TOTP + Password
Segurança
Janelas TOTP devem ter no máximo 30s
Implemente notificação de login simultâneo
Criptografe o segredo, guarde apenas hash
das senhas
OTP não protege aplicação contra
vazamentos catastróficos (banco e fonte)
Referências
https://tools.ietf.org/html/rfc2289 (OTPAuth)
https://tools.ietf.org/html/rfc4226 (HOTP)
https://tools.ietf.org/html/rfc6238 (TOTP)
https://tools.ietf.org/html/rfc2104 (HMAC)
https://tools.ietf.org/html/rfc4648 (Base32)

Mais conteúdo relacionado

Mais de GDGFoz

WebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoTWebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoTGDGFoz
 
Dart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideDart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideGDGFoz
 
UX: O que é e como pode influenciar a vida do desenvolvedor?
UX: O que é e como pode influenciar a vida do desenvolvedor?UX: O que é e como pode influenciar a vida do desenvolvedor?
UX: O que é e como pode influenciar a vida do desenvolvedor?GDGFoz
 
Dicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsDicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsGDGFoz
 
Angular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopAngular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopGDGFoz
 
Automação Residencial Extrema com Opensource
Automação Residencial Extrema com OpensourceAutomação Residencial Extrema com Opensource
Automação Residencial Extrema com OpensourceGDGFoz
 
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?GDGFoz
 
Desmistificando a programação funcional
Desmistificando a programação funcionalDesmistificando a programação funcional
Desmistificando a programação funcionalGDGFoz
 
Microsserviços com Kotlin
Microsserviços com KotlinMicrosserviços com Kotlin
Microsserviços com KotlinGDGFoz
 
Fique em casa seguro (ou tente)!
Fique em casa seguro (ou tente)!Fique em casa seguro (ou tente)!
Fique em casa seguro (ou tente)!GDGFoz
 
Hooks em React: o novo jeito de fazer componentes funcionais
Hooks em React: o novo jeito de fazer componentes funcionaisHooks em React: o novo jeito de fazer componentes funcionais
Hooks em React: o novo jeito de fazer componentes funcionaisGDGFoz
 
Angular, React ou Vue? Comparando os favoritos do JS reativo
Angular, React ou Vue? Comparando os favoritos do JS reativoAngular, React ou Vue? Comparando os favoritos do JS reativo
Angular, React ou Vue? Comparando os favoritos do JS reativoGDGFoz
 
Styled Components - Estilizando components sem stress - Roberto Tauille
Styled Components - Estilizando components sem stress - Roberto TauilleStyled Components - Estilizando components sem stress - Roberto Tauille
Styled Components - Estilizando components sem stress - Roberto TauilleGDGFoz
 
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto Oliveira
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto OliveiraPorque React & GraphQL pode ser uma boa para você - Diogo Augusto Oliveira
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto OliveiraGDGFoz
 
Se familiarizando com React - Andres Ibañez
Se familiarizando com React - Andres IbañezSe familiarizando com React - Andres Ibañez
Se familiarizando com React - Andres IbañezGDGFoz
 
Ligando uma cafeteira com Micropython, Mqtt e Android
Ligando uma cafeteira com Micropython, Mqtt e AndroidLigando uma cafeteira com Micropython, Mqtt e Android
Ligando uma cafeteira com Micropython, Mqtt e AndroidGDGFoz
 
Blockchain só para baixinhos, volume III
 Blockchain só para baixinhos, volume III Blockchain só para baixinhos, volume III
Blockchain só para baixinhos, volume IIIGDGFoz
 
As moedas alternativas privadas podem substituir a moeda nacional?
As moedas alternativas privadas podem substituir a moeda nacional? As moedas alternativas privadas podem substituir a moeda nacional?
As moedas alternativas privadas podem substituir a moeda nacional? GDGFoz
 
Encender una cafetera con Micropython, MQTT y Android
Encender una cafetera con Micropython, MQTT y AndroidEncender una cafetera con Micropython, MQTT y Android
Encender una cafetera con Micropython, MQTT y AndroidGDGFoz
 
Git básico para contributors
Git básico para contributorsGit básico para contributors
Git básico para contributorsGDGFoz
 

Mais de GDGFoz (20)

WebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoTWebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoT
 
Dart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideDart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client Side
 
UX: O que é e como pode influenciar a vida do desenvolvedor?
UX: O que é e como pode influenciar a vida do desenvolvedor?UX: O que é e como pode influenciar a vida do desenvolvedor?
UX: O que é e como pode influenciar a vida do desenvolvedor?
 
Dicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsDicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOps
 
Angular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & DesktopAngular >= 2 - One Framework Mobile & Desktop
Angular >= 2 - One Framework Mobile & Desktop
 
Automação Residencial Extrema com Opensource
Automação Residencial Extrema com OpensourceAutomação Residencial Extrema com Opensource
Automação Residencial Extrema com Opensource
 
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
 
Desmistificando a programação funcional
Desmistificando a programação funcionalDesmistificando a programação funcional
Desmistificando a programação funcional
 
Microsserviços com Kotlin
Microsserviços com KotlinMicrosserviços com Kotlin
Microsserviços com Kotlin
 
Fique em casa seguro (ou tente)!
Fique em casa seguro (ou tente)!Fique em casa seguro (ou tente)!
Fique em casa seguro (ou tente)!
 
Hooks em React: o novo jeito de fazer componentes funcionais
Hooks em React: o novo jeito de fazer componentes funcionaisHooks em React: o novo jeito de fazer componentes funcionais
Hooks em React: o novo jeito de fazer componentes funcionais
 
Angular, React ou Vue? Comparando os favoritos do JS reativo
Angular, React ou Vue? Comparando os favoritos do JS reativoAngular, React ou Vue? Comparando os favoritos do JS reativo
Angular, React ou Vue? Comparando os favoritos do JS reativo
 
Styled Components - Estilizando components sem stress - Roberto Tauille
Styled Components - Estilizando components sem stress - Roberto TauilleStyled Components - Estilizando components sem stress - Roberto Tauille
Styled Components - Estilizando components sem stress - Roberto Tauille
 
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto Oliveira
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto OliveiraPorque React & GraphQL pode ser uma boa para você - Diogo Augusto Oliveira
Porque React & GraphQL pode ser uma boa para você - Diogo Augusto Oliveira
 
Se familiarizando com React - Andres Ibañez
Se familiarizando com React - Andres IbañezSe familiarizando com React - Andres Ibañez
Se familiarizando com React - Andres Ibañez
 
Ligando uma cafeteira com Micropython, Mqtt e Android
Ligando uma cafeteira com Micropython, Mqtt e AndroidLigando uma cafeteira com Micropython, Mqtt e Android
Ligando uma cafeteira com Micropython, Mqtt e Android
 
Blockchain só para baixinhos, volume III
 Blockchain só para baixinhos, volume III Blockchain só para baixinhos, volume III
Blockchain só para baixinhos, volume III
 
As moedas alternativas privadas podem substituir a moeda nacional?
As moedas alternativas privadas podem substituir a moeda nacional? As moedas alternativas privadas podem substituir a moeda nacional?
As moedas alternativas privadas podem substituir a moeda nacional?
 
Encender una cafetera con Micropython, MQTT y Android
Encender una cafetera con Micropython, MQTT y AndroidEncender una cafetera con Micropython, MQTT y Android
Encender una cafetera con Micropython, MQTT y Android
 
Git básico para contributors
Git básico para contributorsGit básico para contributors
Git básico para contributors
 

Autenticação em dois fatores (2FA