fn digest(secret: &str) -> [u8; 32]
Stored by digest, so a timing difference in the lookup says nothing about how much of a guessed secret matches a real one.