Como detectar vazamentos de senha e credenciais violadas

O reCAPTCHA Enterprise pode detectar vazamentos de senhas e credenciais violadas para impedir invasões de conta (ATOs, na sigla em inglês) e ataques de preenchimento de credenciais. Com o reCAPTCHA Enterprise, é possível fazer auditorias regulares das credenciais do usuário (senhas) como parte de qualquer avaliação para garantir que elas não tenham sido vazadas ou violadas. Para realizar essas avaliações, o Google usa o recurso Check-up de senha.

Antes de começar

  1. Escolha o melhor método para configurar o reCAPTCHA Enterprise no ambiente e conclua a configuração.

  2. A detecção de vazamento de senha pode ser acessada após uma análise de segurança. Entre em contato com nossa equipe de vendas para integrar seu site a esse recurso.

Como verificar credenciais violadas e/ou vazadas

Para verificar se um conjunto de credenciais foi comprometido, consulte o banco de dados de verificação de senhas durante avaliações para ações, como logins e alterações ou redefinições de senha.

Ao criar uma avaliação, modifique o nome de usuário de acordo com o processo de canonização e gere um hash da senha usando o Scrypt com um sal específico.

Como canonizar nomes de usuário

Para canonizar um nome de usuário, use letras minúsculas para o nome de usuário e remova o componente do domínio e todos os pontos, conforme mostrado nos exemplos a seguir:

  • canonicalize(foo.bar@COM) = foobar
  • canonicalize(TEST@MAIL.COM) = test

O código a seguir mostra um exemplo da lógica de canonização no Python 3.

#!/usr/bin/env python3

def canonicalize_username(username):
  """Canonicalize a username which must be a UTF-8 encoded string."""
  if "@" in username:
    username = username[:username.rfind("@")]
  return username.lower().replace(".", "")

Computando hashed_user_credentials

  1. Compute Scrypt(canonicalized_username + password + username_updated_salt) em que username_updated_salt = canonicalized_username + fixed_salt e canonicalized_username é a versão canônica do nome de usuário.

    O exemplo do Python 3 a seguir mostra parâmetros fixos de sal e Scrypt.

    #!/usr/bin/env python3
    import base64
    import hashlib
    
    # Scrypt hash salt
    USER_CREDENTIALS_HASH_SALT = [
        48, 118, 42, 210, 63, 123, 161, 155, 248, 227, 66, 252, 161, 167, 141, 6,
        230, 107, 228, 219, 184, 79, 129, 83, 197, 3, 200, 219, 189, 222, 165, 32
    ]
    
    # Scrypt hash parameters and constants
    SCRYPT_HASH_CPU_MEM_COST = 1 << 12
    SCRYPT_HASH_BLOCK_SIZE = 8
    SCRYPT_HASH_PARALLELIZATION = 1
    SCRYPT_MAX_MEMORY = 1024 * 1024 * 32
    SCRYPT_HASH_KEY_LENGTH = 32
    
    def process_credentials(username, password):
      """Process user credentials to be used with the credentials check service."""
    
      canonicalized_username = canonicalize_username(username)
    
      # Compute the salt by appending the username to the fixed hash salt.
      salt = bytes([ord(character) for character in list(canonicalized_username)] +
                   USER_CREDENTIALS_HASH_SALT)
    
      # Compute the data to be hashed
      data = bytes(canonicalized_username + password, encoding="utf8")
    
      # Compute Scrypt hash using hashlib.
      scrypt_hash = hashlib.scrypt(
          password=data,
          salt=salt,
          n=SCRYPT_HASH_CPU_MEM_COST,
          r=SCRYPT_HASH_BLOCK_SIZE,
          p=SCRYPT_HASH_PARALLELIZATION,
          maxmem=SCRYPT_MAX_MEMORY,
          dklen=SCRYPT_HASH_KEY_LENGTH)
      return canonicalized_username, base64.b64encode(scrypt_hash)
    
  2. Para verificar se a implementação está correta, use o exemplo de hash codificado em base64 esperado.

     compute_scrypt_hash(`test@domain.com`, `s0m3passw0rd!`) = `1rzih02go6/dNcr1CQu9Ne+x4CC8xqSVuGaSWe+WhWk=`
    

Solicitação da API

Só é possível criar uma avaliação para detectar vazamentos de senha e credenciais violadas no endpoint v1beta1.

Use o método projects.assessments.create.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: é o ID do projeto do Google Cloud.
  • CANONICALIZED_USERNAME: nome de usuário canônico
  • HASHED_USER_CREDENTIALS: credenciais com hash no Scrypt

Método HTTP e URL:

POST https://recaptchaenterprise.googleapis.com/v1beta1/projects/PROJECT_ID/assessments

Corpo JSON da solicitação:

{
  "password_leak_verification": {
    "canonicalized_username": "CANONICALIZED_USERNAME"
    "hashed_user_credentials": "HASHED_USER_CREDENTIALS"
  }
}

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo chamado request.json e execute o comando a seguir:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1beta1/projects/PROJECT_ID/assessments"

PowerShell

Salve o corpo da solicitação em um arquivo chamado request.json e execute o comando a seguir:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1beta1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/698047609967/assessments/fb22000000000000",
  "score": 0,
  "reasons": [],
  "passwordLeakVerification": {
    "hashedUserCredentials": "IDuS/soXlsLHmOm1A8zw+mChTI561MufdTaqL3k+zC4=",
    "credentialsLeaked": [true | false],
    "canonicalizedUsername": "test"
  }
}