O hash de senha do Postgres está muito próximo do que você fez, ele só precisa que o nome de usuário seja incluído da seguinte forma:
pghash = "md5" + hashlib.md5(password + username).hexdigest()
AFAIK, os documentos do postgres realmente não documentam esse formato de hash e parecem supor que os administradores raramente lidam com esses hashes diretamente :( Não há métodos internos para gerar esses hashes que eu conheça. Se a senha fornecida ao
ALTER USER
O comando não está em conformidade com o formato de hash postgres, ele assume que a senha não foi criptografada e cuida disso internamente - de acordo com os documentos para a palavra-chave ENCRYPTED de CREATE ROLE. (IMHO este é um comportamento falho, porque se um hash depende do nome de usuário, significa que os hashes não podem ser copiados e colados entre contas diferentes, quebrar quando a conta é renomeada e (supondo entropia) tem apenas ~ 6 bits de sal eficaz). O aviso no topo da documentação do passlib para o hash provavelmente poderia ser mais claro. Ele foi feito para avisar as pessoas que navegam pela documentação do passlib que 1) esse hash era terrivelmente inseguro, 2) que eles não deveriam adotá-lo para uso em seus próprios aplicativos e 3) que ele era adequado apenas para trabalhar com contas de usuário postgres, já que é o formato de hash mais forte (e único) que o postgres suporta para suas próprias contas.
(Se você está tentando usar o postgres para hash de senhas para as contas de usuário do seu próprio aplicativo, eu apoio fortemente a recomendação de Clodoaldo de usar bcrypt por meio da extensão pgcrypto).