Kleines Skript: Verschlüsselungs-Argumente für Kommando

28/07/2016 - 09:45 von Helmut Schellong | Report spam
Hallo.

Aus aktuellem Anlaß ein kleines bsh-Skript, das Zeichenketten für
ein Verschlüsselungs-Kommando produziert, die auch als
Fundgrube für sichere Passwörter dienen können.

Ausgabe:
JC:O.*Um@(Hx26~3iA9#8}7q{a=X)0DSh;EbITly+1p5vZtsV,NoeMfWK"]`>\R&
t6!C'xoO(,GF T%K~>2h+X7aj1UA`I?kd#q\HEDgcvSW[w^N9-P;"J0Y3e)f{.&5
?iA;Sg5x,C}VEp8D oLmcs]J2'aNX_IUb&q*1+Y=0PGM">($duRly`.)rF6~%-Hj
|53]sLYx$Xirb74?*ST\_>E=}w1{Km:VN,`gAzZalO!J&PQ^[fop-Bd0CqjhH~WD
$I{BkEWuj]hi`'J57*?+DYe8"K1ScX,mOyL4_~\R@o|)x QsgHfnNA;>=Zl60V^[
L%Ita?={Q78gpySC(~[2Oz:DsK,}@cJ-4*/W\fF"$];xHk.iT m6`r0VvEX&1Mq|
...

Ausgegeben werden 64 Zeichen lange Zeichenketten, deren Zeichen
aus einer Menge von (etwa) 95 Zeichen entnommen werden.
Dabei gibt es keine Wiederholung von Zeichen (->FLAGS).
Laufzeit bei mir für 32 Strings: etwa 0.15 s.

Skript:
==#!/u/bin/bsh

CHARS=' !"#$%&''()*+,-./0123456789:;<=>?@'%
'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`'%
'abcdefghijklmnopqrstuvwxyz{|}~'
CHAR=.

set FLAGS:1${#CHARS} OUT:à64
RANDOM=$(date '+%s')


Get95() {
local i0 f=0
while [ f -eq 0 ]
do
let "i=$RANDOM"'%'"${#CHARS}"
catv i,1,FLAGS =1,f:
done
catv /0 =i,1,FLAGS
catv i,1,CHARS =1,CHAR:
return 0
}


local i0


to 32 repeat
do
for i from 0 to 63 repeat
do
Get95
catv 1,CHAR =i,1,OUT
done
print -r "$OUT"
conv -t01 FLAGS
done

:
==Welche andere Shell kann das (intern)?
(date ist nicht intern, kann aber intern ersetzt werden.)


Mit freundlichen Grüßen
Helmut Schellong var@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
 

Lesen sie die antworten

#1 Stefan Reuther
28/07/2016 - 17:42 | Warnen spam
Am 28.07.2016 um 09:45 schrieb Helmut Schellong:
Ausgabe:
JC:O.*Um@(Hx26~3iA9#8}7q{a=X)0DSh;EbITly+1p5vZtsV,NoeMfWK"]`>\R&
t6!C'xoO(,GF T%K~>2h+X7aj1UA`I?kd#q\HEDgcvSW[w^N9-P;"J0Y3e)f{.&5
?iA;Sg5x,C}VEp8D oLmcs]J2'aNX_IUb&q*1+Y=0PGM">($duRly`.)rF6~%-Hj


[...]
:
==> Welche andere Shell kann das (intern)?



Grundsàtzlich jede.

Mal davon abgesehen, dass ich normalerweise base64 und nicht base95 als
Grundzeichensatz nehmen würde und mir deswegen meine Passworte aus
gemailten ZIPs oder JPEGs rauskopiere :) wàre der Ausgangspunkt:

tr -dc " -~" </dev/urandom | dd bs=1 countd 2>/dev/null

Wenn man jetzt 'dd' und 'tr' unbedingt vermeiden muss, kann man die
Aufgabe "filtere Zeichen außerhalb des druckbaren Bereichs aus, bis es
64 Stück sind" ziemlich simpel intern lösen, jedenfalls mit bash:

LC_ALL=""
line=""
while test "${#line}" -lt 64; do
read -rn1 char
case "$char" in
[\ -~])
line="$line$char"
;;
esac
done < /dev/urandom
echo "$line"

Ohne bash müsste man für 'read -rn1' tricksen, z.B. 'dd bs=1 count=1
tmp; read -r char <tmp'.



Und schlussendlich ist auch die Version komplett ohne /dev/urandom und
somit ohne 'dd' und 'tr' in bash recht trivial, müsste in etwa deiner
entsprechen.

CHARS=" !\"#\$%&'()*+,-./0123456789:;<=>?@\
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`\
abcdefghijklmnopqrstuvwxyz{|}~"

line=""
while test "${#line}" -lt 64; do
line="$line${CHARS:$((RANDOM%95)):1}"
done
echo "$line"

Krieg ich jetzt 'n Keks?


Stefan

Ähnliche fragen