Sicheres _verstecken_ von Passwörten
Lars
- javascript
0 dedlfix0 Gunnar Bittersmann0 Jörg Reinholz0 mark0 MudGuard
Hallo Leute,
folgende Situation: nachdem auf einer Seite ein Button - etwa wie "Login" - geklickt wird öffne ich einen neuen Tab wo man das Passwort eingeben soll. Ist es das richtige, so soll man weitergeleitet werden.
Öffne ich im Firefox mit F12 den Debugger und schaue durch den Script-Code so kann man das Passwort ja ziemlich leicht ausfindig machen und so in die Abfrage eingeben. Nun habe ich mir eine encode und eine decode Funktion gebastelt, mit welcher ich das Passwort verschlüsseln tue, bevor ich es in den Quelltext einfüge. Bei der Abfrage wird dann die Eingabe mit dem return Ergebnis von decode(Passwort) verglichen. Nun habe ich schonmal unterbunden, dass jeder sich das Passwort einfach so aus dem Quelltext herausfischen kann. Allerdings mache ich mir noch Sorgen über die decode Funktion. Diese lässt sich ja einfach so aus dem Quelltext herauskopieren und entweder in die Firefox JavaScript-Umgebung oder in eine eigene lokale HTML Datei im Script Bereich einfügen, was zur Folge hat, dass man sich doch das korrekte Passwort ausgeben lassen kann. Kleines Beispiel:
var passwort = 'whvw';//encoded passwort (return von encode('test')) , hier nur beispielhafte Verschlüsselung: Alphabet +3
function decode(pw) {
var decoded_pw = '';
...
return decoded_pw;
}
//Wenn ich diese decode Funktion nun aus dem Quelltext rausfische und in die Zwischenablage stecke und z.B. in die JavaScript-Umgebung einfüge mit der zusätzlichen Zeile:
console.log(decode('DasAusDemQuelltextGefischteVerschlüsseltePasswort'));
//So ist es ein leichtes Zugang zu Inhalten zu bekommen, die für nicht-passwort-wisser unzugänglich sein sollten.
Was kann ich tun? Ich tue die decode Funktion ja benötigen und muss sie doch daher in den Quelltext schreiben. Kann ich sie irgendwie verstecken? Oder selbst irgendwie verschlüsseln? Wobei man dies besser auch nicht so leicht von außen rückgängig machen können sollte. Oder lässt es sich verhindern, dass jemand sich einfach so den Code einer .js Datei ansieht (--> Firefox F12 Debugger)? Wie könnte ich das Passwort sonst vor den Augen Dritter geheimhalten? Mir steht leider kein PHP zur verfügung, somit bin ich auf Javascript angewiesen.
Ich hoffe mir kann hier jemand weiterhelfen.
LG Lars
Tach!
Was kann ich tun?
Nichts. Wer mit F12 umgehen kann, kann sich auch durch den Code bewegen und die Passwortabfrage ganz umgehen.
dedlfix.
Tag,
Nichts. Wer mit F12 umgehen kann, kann sich auch durch den Code bewegen und die Passwortabfrage ganz umgehen.
Tatsächlich? Habe ich etwa eine Funktion übersehen? Also ich komme aus dieser Zeile nicht raus
...
var eingabe = window.prompt('Kennst du das Passwort?', '');
...
LG Lars
Hallo
Nichts. Wer mit F12 umgehen kann, kann sich auch durch den Code bewegen und die Passwortabfrage ganz umgehen.
Tatsächlich? Habe ich etwa eine Funktion übersehen? Also ich komme aus dieser Zeile nicht raus
... var eingabe = window.prompt('Kennst du das Passwort?', ''); ...
ein Vergleich:
du stehst vor einer gut verschlossenen Pforte und versuchst das Schloss zu knacken. Aber links und rechts der Pforte ist gar kein Zaun.
Gruß Jürgen
Tag,
Nichts. Wer mit F12 umgehen kann, kann sich auch durch den Code bewegen und die Passwortabfrage ganz umgehen. ein Vergleich: du stehst vor einer gut verschlossenen Pforte und versuchst das Schloss zu knacken. Aber links und rechts der Pforte ist gar kein Zaun.
Tja, wäre ich ja ein ziemlich ungeschickter Einbrecher, wenn ich nicht sähe, dass links und rechts kein Zaun ist.
Aber nun zurück zum F12: wie "kann [ich mich] durch den Code bewegen und die Passwortabfrage [(aka. window.prompt)] ganz umgehen?
LG Lars
Moin!
Nichts. Wer mit F12 umgehen kann, kann sich auch durch den Code bewegen und die Passwortabfrage ganz umgehen. ein Vergleich: du stehst vor einer gut verschlossenen Pforte und versuchst das Schloss zu knacken. Aber links und rechts der Pforte ist gar kein Zaun. Tja, wäre ich ja ein ziemlich ungeschickter Einbrecher, wenn ich nicht sähe, dass links und rechts kein Zaun ist.
Aber nun zurück zum F12: wie "kann [ich mich] durch den Code bewegen und die Passwortabfrage [(aka. window.prompt)] ganz umgehen?
LG Lars
Einfach Javascript-Code an der Stelle abändern:
Alt: if (password == decoded_password()) { goto_targetpage() }
Neu: if (password != decoded_password()) { goto_targetpage() }
Schon verweigert nur noch das richtige Passwort das Weiterkommen, anstatt es zu ermöglichen.
Grüße Sven
Tag,
Einfach Javascript-Code an der Stelle abändern: Alt: if (password == decoded_password()) { goto_targetpage() } Neu: if (password != decoded_password()) { goto_targetpage() } Schon verweigert nur noch das richtige Passwort das Weiterkommen, anstatt es zu ermöglichen.
Nun, ich denke doch man muss die Seite bei sich auf der Festplatte speichern um an dem Seiteneigenen Javascript rumdoktorn zu können. Aber in der Tat sehe ich kein Problem dass diese Methode nicht funktionieren würde. Aber was das mit F12 zu tun haben soll weiß ich nicht... Wenn überhaupt dann wäre das wohl Strg + S und ein Texteditor-OP-Tisch.
LG Lars
Tach!
Einfach Javascript-Code an der Stelle abändern:
Oder die Inhalte von Variablen. Oder den Code im Passwort-erfolgreich-Zweig fortsetzen lassen. Es gibt da so einige Möglichkeiten.
Nun, ich denke doch man muss die Seite bei sich auf der Festplatte speichern um an dem Seiteneigenen Javascript rumdoktorn zu können.
Die Werkzeuge im Browser sind recht mächtig. Man kann mit ihnen direkt ins Geschehen eingreifen.
Aber was das mit F12 zu tun haben soll weiß ich nicht...
F12 ist bei Internet Explorer, bei Chrome und Firebug die Taste zum Aktivieren der Entwicklertools.
Das einzige was man mit Javascript machen kann ist, dass das Passwort einen Teil der URL bildet, unter der man die zu „schützende“ Ressource versteckt. Dann kann man es aber nicht mit Javascript prüfen sondern muss die Aufgabe dem Webserver überlassen. Der findet entweder was oder gibt ein 404 zurück.
dedlfix.
Moin!
Das einzige was man mit Javascript machen kann ist, dass das Passwort einen Teil der URL bildet,
Nebensächlichkeit: Nach der höchst aktuellen und höchst besonderen Ansicht des LG Berlin stellt eine ausschließlich einer Person einmalig privat übermittelte URL wie
http://server/dir/qxe2745x75xveu7v36e576xvzfutxtv654vx656x35.png
keinen Zugriffschutz dar, der es unberechtigten Personen unmöglich macht, auf die Datei zuzugreifen. Es handele sich hierbei um eine Veröffentlichung.
(Das Urteil wird aber keinen Bestand haben. Nur wird, bis der BGH das anders entscheidet, zu ziemlich jeder Blödmann in Robe diesen Mist abschreiben)
Jörg Reinholz
Aloha ;)
Nebensächlichkeit: Nach der höchst aktuellen und höchst besonderen Ansicht des LG Berlin
Skurril, wirklich skurril...
Grüße,
RIDER
@@Lars
Mir steht leider kein PHP zur verfügung, somit bin ich auf Javascript angewiesen.
Hinten anstellen, bitte.
Warum steht dir kein PHP zur Verfügung? Welche serverseitige Technik steht dir zur Verfügung? (Kann auch JavaScript sein.)
Ich hoffe mir kann hier jemand weiterhelfen.
Wenn du auf clientseitiges JavaScript angewiesen bist, nein.
LLAP
Moin!
Ist es das richtige, so soll man weitergeleitet werden.
Dem Einbrecher wird das Passwort völlig schnurz sein (es sei denn er möchte außerdem noch probieren, ob es auch für Deinen Webmail- oder Online-Banking-Zugang passt).
Der schaut einfach nach, wohin die Reise gehen soll.
Allerdings gibt es von Google eine "Crypto-API".
Damit kann man durchaus mit einem Passwort vorverschlüsselte Inhalte verschlüsselt übersenden und das eingegebene Passwort zum Entschlüsseln nutzen. Das Passwort wird dabei GAR NICHT in der Webseite gespeichert. Du könntest also die URL, besser aber komplette Seiteninhalte verschlüsselt übertragen und dann im Browser entschlüsseln.
Nachteil: Jemand lädt sich die Seite runter und fährt ganz bequem zu Hause eine Brut-Force-Attacke. Das verwendet Passwort müsste eine stolze Länge haben.
Jörg Reinholz
Tag,
Ist es das richtige, so soll man weitergeleitet werden. Dem Einbrecher wird das Passwort völlig schnurz sein (es sei denn er möchte außerdem noch probieren, ob es auch für Deinen Webmail- oder Online-Banking-Zugang passt). Der schaut einfach nach, wohin die Reise gehen soll.
Sorry, ich vergaß zu erwähnen, dass das Ziel der Reise natürlich auch verschlüsselt ist.
Allerdings gibt es von Google eine "Crypto-API". Damit kann man durchaus mit einem Passwort vorverschlüsselte Inhalte verschlüsselt übersenden und das eingegebene Passwort zum Entschlüsseln nutzen. Das Passwort wird dabei GAR NICHT in der Webseite gespeichert. Du könntest also die URL, besser aber komplette Seiteninhalte verschlüsselt übertragen und dann im Browser entschlüsseln.
Das hört sich interessant an. Aber welches soll ich nehmen? AES?
LG Lars
Tag,
Also, dieses CryptoJS ist ja eine ziemlich ... interessante Sache - wenn auch praktisch unmöglich für einen Laien zu verstehen welche Funktion was zurückliefert und was dann damit zu tun ist. Ich habe eine Zeit lang googeln müssen um das einigermaßen erklärt zu bekommen. Schaut sich doch mal jemand dort auf der Seite den Code vom AES Beispiel an... das ist doch das letzte - würde ich sagen. Den letzten, aber doch wohl entscheidensten Schritt einfach weg zu lassen...
So wird AES benutzt:
var encrypted = CryptoJS.AES.encrypt('Geheimer Text', 'passwort');
var decrypted = CryptoJS.AES.decrypt(encrypted, 'passwort');
//Der Laie würde sich jetzt mal encrypted und decrypted ausgeben lassen um zu schauen ob der Kram auch tatsächlich funktioniert - man kann ja nie wissen ;-)
//console.log(encrypted + '\n ' + decrypted);
//Tja, viel Spaß mit dem Ergebnis...
//Hier die Zeile, die einem endlich ein Lichtlein zeigt
decrypted_str = decrypted.toString(CryptoJS.enc.Utf8);
//console.log(decrypted_str); ==> 'Geheimer Text'
Gibt man ein anderes 'passwort' zum entschlüsseln ein als man zum verschlüsseln verwendet hat so gibt console.log(decrypted_str) ==> '' - eine leere Zeichenkette aus. So gehe ich davon aus, dass man nun mit
var passwort = window.prompt('...', '');
var decrypted = CryptoJS.AES.decrypt((encrypted_content), passwort);
var decrypted_str = ... (s.o.)
if (decrypted_str.length !== 0)
doSth();
überprüfen kann, ob jemand das Passwort kennt, oder eben nicht.
Abschließende Fragen: Habe ich einen Fehler gemacht? Gibt es noch was zu beachten / anzumerken?
LG Lars
Moin!
Abschließende Fragen: Habe ich einen Fehler gemacht? Gibt es noch was zu beachten / anzumerken?
mach es doch so:
Du machst Dir lokal eine Webseite in welcher der geheime Inhalt steht. (Blind geschrieben, völlig ungetestet, nur eine Idee wie es in etwa gehen könnte.)
<html>
<head>
…
</head>
<body>
<div id="CryptThis">
Hier kommt hinein was verschlüsselt werden soll.
</div>
<pre id="ausgabe" style="border: 2px solid red"><pre>
<script type="text/javascript">
document.gerElementById('ausgabe').innerHtml = CryptoJS.AES.encrypt(document.getElementById('CryptThis').innerHTML, PASSWORT);
</script>
</body>
</html>
nehmen wir mal an, da kommt im roten Rahmen was wie:
nukdfz7if6se856324 2hi3z4ib4tr756i45bzikcur434i7r46bi
b7i6r43b 4tt86 34ri74rz847r6 7i4r347ibtr 76483r86348
heraus. (Es wird nur ähnlich aussehen).
Das Ergebnis im Rahmen nimmst Du und baust es in eine weitere Datei ein, die Du dann ins Netz überträgst:
<html>
<head>
…
</head>
<body>
<div id="encrypted">
nukdfz7if6se856324 2hi3z4ib4tr756i45bzikcur434i7r46bi
b7i6r43b 4tt86 34ri74rz847r6 7i4r347ibtr 76483r86348
</div>
<body>
<script type= "text/javascript">
var passwort = window.prompt('...', '');
var body=document.getElementsByTagname('body')[0];
encrypted_content=document.getElementById('encrypted').innerHTML;
decrypted = CryptoJS.AES.decrypt((encrypted_content), passwort);
body.innerHtml = decrypted.toString(CryptoJS.enc.Utf8);
</script>
</html>
Jörg Reinholz
Wie könnte ich das Passwort sonst vor den Augen Dritter geheimhalten? Mir steht leider kein PHP zur verfügung, somit bin ich auf Javascript angewiesen.
Nur mit javascript clientseitig gibt es da m.M. keinen Weg, dies sicher(tm) zu bewerkstelligen.
Ich hoffe mir kann hier jemand weiterhelfen.
Hmmm ... htaccess erlaubt dein Anbieter auch nicht?
lg
Hi,
folgende Situation: nachdem auf einer Seite ein Button - etwa wie "Login" - geklickt wird öffne ich einen neuen Tab wo man das Passwort eingeben soll. Ist es das richtige, so soll man weitergeleitet werden.
Öffne ich im Firefox mit F12 den Debugger und schaue durch den Script-Code so kann man das Passwort ja ziemlich leicht ausfindig machen und so in die Abfrage eingeben.
Darum darf es dort auch nicht erscheinen.
Nimm die Ziel-Url und verschlüssele Sie mit Hilfe des Paßworts (und mit einer Verschlüsselung, für die es auch eine Javascript-Entschlüsselungsmethode gibt).
Wenn der User das Paßwort eingegeben hat, entschlüsselst Du damit die URL, und falls das Ergebnis mit http:// beginnt (also wenn die Entschlüsselung erfolgreich war), leitest Du auf diese URL weiter.
Das verhindert aber nicht, daß ein User, der das richtige Paßwort kennt, danach die entschlüsselte URL sieht und weitergibt.
cu,
Andreas a/k/a MudGuard