private void handleServerFinalMessage(byte[] signature) throws SaslException {
        try {
            byte[] serverKey = formatter.serverKey(saltedPassword);
            byte[] serverSignature = formatter.serverSignature(serverKey, clientFirstMessage, serverFirstMessage, clientFinalMessage);
            if (!MessageDigest.isEqual(signature, serverSignature))
                throw new SaslException("Invalid server signature in server final message");
        } catch (InvalidKeyException e) {
            throw new SaslException("Sasl server signature verification failed", e);
        }
    }
SaslClient implementation for SASL/SCRAM.
<p>
This implementation expects a login module that populates username as
the Subject's public credential and password as the private credential.

@see <a href="https://tools.ietf.org/html/rfc5802">RFC 5802</a>
clients/src/main/java/org/apache/kafka/common/security/scram/internals/ScramSaslClient.java