In SCRAM (RFC5802, page 8) the client generates
ClientKey to server, which is a derivation of the original password. This is communicated to the server in a secure fashion, which then performs a single hash operation
H(ClientKey) and check if that's equal to
StoredKey. That is, the client proves knowledge of something which, when hashed, equals something stored on the server.
I understand that SCRAM puts a lot of steps in between to include a challenge-response mechanism and never actually sending the real key over the wire and such. However, I don't to see how this is conceptually different from sending
PlaintextPassword and comparing it to the server's
H(PlaintextPassword). Note that this is a single hash operation, not the original PBKDF2 used to derive
ClientKey in the first place. In SCRAM wouldn't the
ClientKey be just as sensitive as
PlaintextPassword? If an attacker were to gain knowledge of
PlaintextPassword is not needed anymore. Since it's only secured in storage using a single hash operation, doesn't this make SCRAM in it's defined implementation vulnerable to rainbow tables on a leaked database?
Bonus question: would there be any problem with taking that single hash operation and replacing it with something stronger, like another round of PBKDF2 or even scrypt?