Je viens de faire une preuve de concept pour un de mes amis, en utilisant l'idée de @sinfere :
démo : http://jsfiddle.net/jkrielaars/y64wjuhj/4/
Le début de l'entrée est décalé de sorte qu'il se trouve à l'extérieur du conteneur (dont le débordement est masqué). Les caractères réels (et le curseur clignotant) ne seront jamais visibles. La fausse div est placée sous le champ de saisie, de sorte qu'un tap sur la fausse div mettra le focus sur la saisie invisible.
<div class="container">
<div id="fake" class="fake">
<span class='star empty'></span>
<span class='star empty'></span>
<span class='star empty'></span>
<span class='star empty'></span>
</div>
<input type="text" id="password" class="invisible" maxlength="4">
</div>