Suppose I have a dumb password checking function:
def dumb_checker(password):
return password == "my_secret_key_that_should_not_be_revealed"
One can hide a password by hashing it as follows:
def obfuscated_checker(password):
return hash(password) == PRECOMPUTED_HASH_OF_MY_SECRET_KEY
which means that the indistinguishability obfuscator ($IO$) should also hide the password, because it's the best-possible obfuscator.
But can't the indistinguishability obfuscator take any password checking function and return the dumb_checker
as the canonical form? For any two equivalent implementations $F_1$ and $F_2$, both $IO(F_1)$ and $IO(F_2)$ be equal to the dumb_checker
function, so an adversary will not be able to distinguish whether he is given $IO(F_1)$ or $IO(F_2)$. And yet, this obfuscation does not hide the password.