Datenlecks und gehackte Anmeldedaten erkennen

reCAPTCHA Enterprise kann Passwortlecks und gehackte Anmeldedaten erkennen, um Kontoübernahmen (ATOs) und Credential Stuffing-Angriffe zu verhindern. Mit reCAPTCHA Enterprise können Sie im Rahmen jeder Bewertung regelmäßig Audits von Nutzeranmeldedaten (Passwörtern) ausführen, um sicherzustellen, dass sie nicht manipuliert oder gehackt wurden. Zur Durchführung dieser Bewertungen verwendet Google die Passwortcheck-Funktion.

Hinweis

  1. Wählen Sie die beste Methode zum Einrichten von reCAPTCHA Enterprise in Ihrer Umgebung aus und schließen Sie die Einrichtung ab.

  2. Passwortlecks können nach einer Sicherheitsüberprüfung aufgerufen werden. Wenden Sie sich an unser Vertriebsteam, um Ihre Website für diese Funktion zu registrieren.

Auf manipukierte und/oder gehackte Anmeldedaten prüfen

Um zu prüfen, ob eine Gruppe von Anmeldedaten manipuliert wurde, können Sie während der Prüfung von Aktionen, z. B. Anmeldungen und Passwortänderungen oder -zurücksetzungen, die Passwortcheck-Datenbank abfragen.

Ändern Sie beim Erstellen einer Bewertung den Nutzernamen gemäß dem Kanonisierungsprozess und hashen Sie das Passwort mit Scrypt mit einem bestimmten Salt.

Nutzernamen kanonisieren

Verwenden Sie zum Kanonisieren eines Nutzernamens Kleinbuchstaben für den Nutzernamen und entfernen Sie die Domainkomponente sowie alle Punkte, wie in den folgenden Beispielen gezeigt:

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

Der folgende Code zeigt ein Beispiel für die Kanonisierungslogik in 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(".", "")

hashed_user_credentials berechnen

  1. Berechnen Sie Scrypt(canonicalized_username + password + username_updated_salt), wobei username_updated_salt = canonicalized_username + fixed_salt und canonicalized_username die kanonische Version des Nutzernamens sind.

    Das folgende Python 3-Beispiel zeigt feste Salt- und Scrypt-Parameter.

    #!/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. Verwenden Sie das folgende beispielhafte base64-codierte Hash, um zu prüfen, ob Ihre Implementierung korrekt ist.

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

API-Anfrage

Das Erstellen einer Bewertung zur Erkennung von Passwortlecks und gehackten Anmeldedaten wird nur auf dem Endpunkt v1beta1 unterstützt.

Verwenden Sie die Methode projects.assessments.create.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: Ihre Google Cloud-Projekt-ID
  • CANONICALIZED_USERNAME: Kanonisierter Nutzername
  • HASHED_USER_CREDENTIALS: Mit Scrypt gehashte Anmeldedaten

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$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

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

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