Nella tua domanda stai prendendo solo le chiavi, in cui una chiave può essere firmata da qualcun altro, ma la chiave non è associata a un'identità stessa:
If John also has a key signed by Peter, presents it to Bob, Bob verifies, but John says that his username is Alice, than what to do?
Quindi proponi il concetto di aggiungere l'identità:
Is it ok if Peter instead signs the hash of Alice's name and her public key(Alice's key and name combined),...
In questo modo hai descritto uno degli elementi principali di un'infrastruttura a chiave pubblica (PKI): il certificato. I certificati sono informazioni sull'identità (nome di Alice) combinata con la chiave pubblica appartenente all'identità (chiave pubblica di Alice) e tutto questo insieme firmato dall'emittente (utilizzando la chiave privata di Peter).
Ogni volta che si esegue una connessione HTTPS, il server invia tale certificato e il client verifica che il nome nell'URL corrisponda al nome nel certificato, cioè che l'identità dichiarata e effettiva corrisponda. Un certificato contiene ancora più informazioni, come durata del certificato o cosa è utilizzabile.
What if the hash was cracked?
Se l'hash è incrinato o se la chiave privata viene rilevata, sarebbe male e potrebbe essere usata per falsificare un'identità. Ecco perché gli hash sicuri vengono utilizzati come attualmente SHA-256.
Also, Peter will be offline when Alice connects to Bob.
Questo non importa molto. Bob non ha bisogno di chiedere a Peter se il certificato Alice è valido perché Bob conosce e si fida del certificato degli emittenti (Peters). Ma di tanto in tanto sarebbe utile chiedere a Peter se Alice revocasse il certificato.
Per maggiori dettagli guarda come funziona un PKI .