Einfaches Skript, das Text parst, was ist hier falsch?

0

Ich bin ein großer Benutzer von https://www.grc.com/passwords.htm um sichere Passwörter zu erhalten. Da ich jedoch jedes Mal auf die Website gehen und das Kennwort manuell kopieren muss, wird es schnell alt, weshalb ich mich dazu entschied, ein kleines Skript für mich zu erstellen. Jedes Mal, wenn Sie die Seite neu laden, werden neue Passwörter im Klartext angezeigt. Dies ist also das Skript.

curl ' https://www.grc.com/passwords.htm '| grep '63 zufällig druckbare ASCII-Zeichen: '| sed 's /^.* size = 2 & gt; //' | sed 's / & lt; \ / font & gt;. * $ //' | pbcopy

Da es keine identifizierenden Klassen oder IDs gibt, bringe ich die Seite durch curl, Pfeife es an grep um die gewünschte Zeile zu erhalten ("63 zufällige druckbare ASCII-Zeichen:"), und dann verwende ich sed um alles bis zum Passwort zu löschen, sowie alles danach, schließlich mit in die Zwischenablage kopieren pbcopy.

Alles funktioniert gut, bis auf ein kleines Detail. Die Zeichenfolge, die ich am Ende bekomme, sollte immer 63 Zeichen lang sein, ist es aber nicht. Es variiert normalerweise zwischen 64, 67, 70 und 73 und ich habe keine Ahnung, warum.

Kann jemand etwas Licht auf dieses werfen?

user137369
quelle
Ich würde einem serverseitig generierten Passwort nicht wirklich vertrauen.
Dennis
Das ist natürlich Ihre Wahl, aber wir sprechen hier nicht über Amateure, wir sprechen über umfangreiches Wissen und Forschung. Lesen Sie einfach die ersten Zeilen auf der Seite und Sie werden sehen, warum es sicher ist.
user137369
Das Design wirkt solide. Das Problem ist, dass das Server das Passwort generiert. Das heißt, sie wissen es.
Dennis
@ user137369 Die Gefahr besteht darin, dass der entfernte Anbieter die generierten Kennwörter (aus irgendeinem Grund) speichert oder jemand den Netzwerkverkehr abfängt (wiederum aus irgendeinem Grund). Egal wie klug der Generierungsalgorithmus ist, wirklich zufällige Bits zu erhalten, Sie öffnen sich z. "Dictionary" ("alle von GRC 2012 generierten Passwörter") greift an.
Daniel Beck
Bitte lesen Sie die Website (das meiste ist für dieses Thema interessant), aber auch die ersten Zeilen beantworten diese Bedenken. Das Knacken von 63 Zeichen ist nach heutigen Maßstäben nicht einmal realistisch, und selbst wenn Sie "alle von GRC 2012 generierten Passwörter" erhalten könnten (was Sie nicht können), da sie in verschiedenen Websites verwendet werden, die selbst Hash-Werte enthalten unglaublich lange Regenbogentische und Kombinationen dazu. Darüber hinaus kann die Seite nur angezeigt werden, wenn eine sichere Verbindung verfügbar ist.
user137369

Antworten:

1

Wie Mousio Das Problem ist bereits die HTML-Kodierung einiger Sonderzeichen.

Perl kann diese zuverlässig und einfach konvertieren:

curl 'https://www.grc.com/passwords.htm' | \
    grep 'ASCII characters:' \
    perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
Dennis
quelle
grep gibt mir einen Fehler (der -P Option existiert nicht). Wahrscheinlich benutzen wir verschiedene Versionen davon (ich bin unter OSX).
user137369
Interessant. Nun, der Perlteil ist der wichtige Teil. Sie können entweder sed weiterhin verwenden oder das Ersetzen mit Perl durchführen (siehe aktualisierte Antwort).
Dennis
Obwohl ich nie benutzt habe perlJetzt kann ich diesen Befehl lesen und nur verstehen, was er tut, und er ist viel effizienter als mein ausführlich ausführlicher Befehl. Danke, als die neue beste Antwort markiert.
user137369
2

Es könnte sich um die HTML-Codierung handeln, bei der z. ein < in den 63 Zeichen wird tatsächlich als Entität dargestellt &lt; in der Quelle, wodurch Ihre Saite etwas länger wird.

mousio
quelle
Vielen Dank. Das war genau der Fall. Der Befehl ist jetzt viel ausführlicher, scheint jedoch jedes Mal zu funktionieren. curl "https://www.grc.com/passwords.htm" | grep "63 random printable ASCII characters:" | sed "s/^.*size=2>//" | sed "s/<\/font>.*$//" | sed "s/&quot;/\"/g" | sed "s/&apos;/'/g" | sed "s/&amp;/&/g" | sed "s/&lt;/</g" | sed "s/&gt;/>/g" | pbcopy. Wenn Sie eine weniger ausführliche Vorgehensweise kennen, würde ich es schätzen (sofern keine Werkzeuge erforderlich sind, die standardmäßig nicht installiert sind).
user137369
0

Beachten Sie Folgendes: Die resultierende Zeichenfolge Ihres Skripts enthält möglicherweise bestimmte Zeichen, die in den sed-Vorgängen nicht ordnungsgemäß maskiert werden.

Diese Zeichen können zum Beispiel verdächtig sein: Klammern, einfache und doppelte Anführungszeichen, geschweifte Klammern, Ausrufezeichen und der Vorwärts- und Rückwärtsstrich sowie Sternchen.

Ich würde versuchen, eines dieser Zeichen aus der zurückgegebenen Zeichenfolge in einer Reihe von Tests zu entfernen und die Ergebnisse zu vergleichen, um zu sehen, ob das Entfernen eines beliebigen Zeichens einer beliebigen Anzahl dieser Zeichen die Zählung auf 63 bringt.

Indy Jones
quelle
Das sed Operationen wurden einzeln durchgeführt und getestet, während ich mitging. Siehe die Antwort von mousio, er fand das Problem, es hatte mit HTML-Zeichen zu tun, die eine spezielle Kodierung haben.
user137369
0

Basierend auf Ihrem Kommentar zu mousio kann Ihre Kette von grep / sed auf einen Befehl reduziert werden:

Perl wird normalerweise standardmäßig installiert

perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/&/g; s/&lt;/</g; s/&gt;/>/g; print; exit'

Nicht alle Sed verstehen diese Syntax

sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/\&/g; s/&lt;/</g; s/&gt;/>/g; p;q}'
glenn jackman
quelle