Ein wirklich komplexer Algorithmus ist in diesem Kontext wohl irgendwie vergebliche Liebesmüh, weil man Java-Programme ja einfach disassemblieren und debuggen kann. Aber wenn schon würde sich ein unsymmetrisches Verfahren wie RSA anbieten:
http://java.sun.com/products/jce/doc/guide/API_users_guide.html
Aber ganz ehrlich halte ich das in diesem Fall für etwas übertrieben. Ein einfacher Ansatz wäre es z.B. die Login-Namen als "array of byte" zu betrachten und dann irgendwelche Polynome daraus zu berechnen (3*b[0] + 24*b[1]*b[1] ...). Die so erhaltenen Zahlen kannst Du dann für jeden Login-Namen im Programm oder in einer Datei ablegen.
Besonders billig wäre z.B. ein (modifierter) CRC32-Algorithmus. Der Standardalgorithmus ist eventuell ein bißchen arg offensichtlich, aber mit ein paar veränderten Parametern wäre das schon ganz ok.
Eine Abwandlung dieser Möglichkeit wäre es, aus dem Login-Namen über einen Algorithmus ein Paßwort zu basteln bzw die berechnete Zahl als "Paßwort" zu benutzen. Damit brauchst Du die Login-Daten nicht zu speichern und kannst trotzdem für jeden Login ein Paßwort berechnen, daß Du dann durch den identischen Algorithmus im Programm verifizieren kannst.
Die möglichen Algorithmen dazu reichen von einfachem Umsortieren/Austauschen der Buchstaben des Login-Namens bis zu RSA und dergleichen. Beispielsweise könntest Du den Login-Namen per RSA o.ä. in ein Paßwort verschlüsseln. Eventuell mußt Du das Ergebnis dann noch in eine "ausdruckbare" Form bringen (billigste Lösung: Hexstring).
Vorteil eines umsymmetrischen Verfahrens: zur Überprüfung des Paßworts brauchst Du bloß einen "öffentlichen" Schlüssel, zu Erzeugung den privaten. Also kann man durch Analyse des Quellcodes nicht an den privaten Schlüssel kommen, um sich neue Paßwörter zu erzeugen.
Auf die Schnelle habe ich hier ein paar Beispiele gefunden:
http://www.rgagnon.com/javadetails/java-0400.html
http://javaalmanac.com/egs/javax.crypto/DesString.html
gibt aber sicher bessere (Google: "java encrypt string")
Richtig sicher sind diese Lösungen aber alle nicht, weil Java einfach zun anfällig für Debugging usw. ist und Du ja alles in einem Programm haben willst (sprich die Paßwörter, der/die Schlüssel unde/oder der Algorithmus sind im Programm vorhanden und damit für einen mäßig begabten Programmierer analysierbar). Außerdem läßt sich mit wenig Aufwand die gesamte Abfrage umgehen.
Eine bessere Möglichkeit wäre es, mit dem gleichen unsymmetrischen Verfahren gewisse Ressourcen des Programms zu entschlüsseln -> ohne korrektes Paßwort ist Programm nicht lauffähig und Analyse des Programms ohne gültigen Schlüssel ist hoffnungslos.
Das wäre wohl die Ultima Ratio, aber halt wirklich nur zum Schutz sehr aufwändiger Programme sinnvoll.