Indexierung von Elementen aus Strings fehlerhaft?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Dee »

Hallo sehr geehrte Lazarus-Community,

ich bin gerade dabei einen Passwort-Generator zu entwickeln, doch ich habe ein Problem bei der Zusammensetzung des Passwortes. Ich habe einige Konstanten definiert, welche entsprechende Zeichenketten enthalten, welche für das Passwort verwendet werden können. Der Vorgang ist simpel: Der Nutzer wählt die Zeichen aus, welche für das Passwort verwendet werden sollen. Es entsteht ein Zeichenvorrat, aus dem via Zufall ein Zeichen ausgewählt und in ein seperaten String gespeichert wird. Hier ist das Problem: Oft enthält das Passwort nicht die Anzahl an Zeichen, welche durch den Nutzer festgelegt wurde.

Hier mal etwas Code:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Forms, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
const
  Charset = '^°!"²§³$%&/{([)]=}?\`´*+~''#_-:,;µ@|<>1234567890qwertzuiopüäölkjhgfdsayxcvbnmQWERTZUIOPÜÄÖLKJHGFDSAYXCVBNM';
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Byte;
begin
  Edit1.Text := '';
 
  for i := 1 to 20 do // Passwortlänge aus 20 Zeichen begrenzen
  begin
    Edit1.Text := Edit1.Text + Charset[Random(Length(Charset)) + 1]  // zufälliges Zeichen aus Charset wählen
  end;
end;
 
end.
 


Ich habe die ganze Sache mal unter Delphi 7 probiert und dort klappte alles fehlerfrei. Hat jemand eine Idee, woran es liegen könnte, dass manchmal keine Zeichen aus der Zeichenkette ausgewählt werden?

MfG
-- Dee

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von theo »

Schmeiss die Umlaute und sonstigen Krimskrams raus, die gehören sowieso nicht in ein Passwort.
Der String ist in UTF-8 und manche Zeichen benötigen mehr als ein Byte.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Christian »

Genau, passwörter MÜSSEN nämlich aus maximal einer zeichenart bestehen am besten kleinbuchstaben zwischen a und d nur dann sind sie richtig sicher auf keinen Fal sollte man Großbuchstaben, Zahlen oder Sonderzeichen verwenden.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Komoluna »

Ümläüte währen schön immer schwierig...

Code: Alles auswählen

glDisable(gl_Irony);


Ich verhak mich da auch dauernd in irgendwelchen Kodierungen oder Zeichentabellen.

MFG

Komoluna

P.S.: Nimm einfach a-z, A-Z 0-9 und vlt. noch !?+-*/\# aber sonst nichts.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Mathias »

auf keinen Fal sollte man Großbuchstaben, Zahlen oder Sonderzeichen verwenden.

Man liesst überall, das ein sicheres Passwort auch diese Zeichen enthält.

Ich würde mich auf die Zeichen zwischen 33 und 127 beschränken, diese sollten auf jedem System gleich sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von m.fuchs »

n
Mathias hat geschrieben:
auf keinen Fall sollte man Großbuchstaben, Zahlen oder Sonderzeichen verwenden.

Man liest überall, das ein sicheres Passwort auch diese Zeichen enthält.

Ich glaube du musst deinen Ironiedetektor mal neu justieren. :wink:

Aber um mal etwas substanzielles beizutragen:

Code: Alles auswählen

const
  Charset: array[1..105] of String = ('^', '°', '!', '"', '²', '§', '³', '$', '%', '&', '/', '{', '(', '[', ')', ']',
                                      '=', '}', '?', '\', '`', '´', '*', '+', '~', '''', '#', '_', '-', ':', ',', ';',
                                      '
µ', '@', '|', '<', '>', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'q',
                                      '
w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', 'ä', 'ö', 'l', 'k', 'j', 'h',
                                      '
g', 'f', 'd', 's', 'a', 'y', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R',
                                      '
T', 'Z', 'U', 'I', 'O', 'P', 'Ü', 'Ä', 'Ö', 'L', 'K', 'J', 'H', 'G', 'F', 'D',
                                      '
S', 'A', 'Y', 'X', 'C', 'V', 'B', 'N', 'M');


hth
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Christian »

Michael, in deinem array sind auch strings die mehr als ein zeichen lang sind wenn das fileencoding auf utf8 steht...

Du könntest mit ConvertEncoding(GuessEncoding(Zeichen),Zeichen,ISOxxxx) auf ein Zeichen wandeln.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Mathias »

Ich würde Charset so mit Daten füllen:

Code: Alles auswählen

var
  Charset: array of char;
  i: integer;
begin
  SetLength(Charset, 128 - 32);
  for i := 0 to Length(Charset) - 1 do begin
    Charset[i] := char(i + 33);
  end;
  Writeln(string(Charset));
end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von m.fuchs »

Christian hat geschrieben:Michael, in deinem array sind auch strings die mehr als ein zeichen lang sind wenn das fileencoding auf utf8 steht...

Mehr als ein Byte meinst du? Ein einzelnes Zeichen ist es doch trotzdem. Und die Bytelänge ist doch egal.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von theo »

Vielleicht sollte man den OP Dee mal wieder zu Wort kommen lassen, bevor man sich hier mit halbgaren Vorschlägen gegenseitig übertrifft.
Vielleicht soll das ganze ja auch für kyrillische Zeichen etc. funktionieren?

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Dee »

Also, erstmal Danke an die ganzen Beiträge. Den Ironie-Kram hätte man sich sparen können. So etwas kann ich nicht leiden. Wenn man einen Beitrag verfasst, dann sollte dieser auch hilfreich bzw. nützlich sein.

@Mathias: Da ich weiß, welche Zeichen für den Zeichenvorrat verwendet werden sollen, kann ich auch gleich Konstanten definieren. Das erfordert keine Performance.

Ich verstehe nicht ganz, was es mit der (Byte-)Länge der einzelnen Zeichen auf sich haben soll.
Ich dachte, dass Lazarus intelligent genug wäre, um ein einzelne Zeichen aus einem String auszulesen. Das klappt zwar, aber manche Zeichen werden eben nicht ausgegeben, wie eben die Umlaute.

@theo: Solche Zeichen wären vielleicht auch interessant, aber ich denke nicht, dass es Log-Ins gibt, die diese zulassen würden. Du kannst mich gerne eines Besseren belehren.

Edit:

@m.fuchs: Dein Code ist hilfreich, danke. Aber es kostet viel Zeit, das zu definieren. Gibt es denn keine andere Möglichkeit, die weniger Tipparbeit erfordert? Klar, ich könnte das einfach kopieren, aber ich würde gerne weniger Code verwenden.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von creed steiger »

Dee hat geschrieben:
@theo: Solche Zeichen wären vielleicht auch interessant, aber ich denke nicht, dass es Log-Ins gibt, die diese zulassen würden. Du kannst mich gerne eines Besseren belehren.


z.B.
http://www.freepascal.ru/forum/

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von shokwave »

Wie wäre es mit den UTF8-Funktionen, aus der Unit LazUTF8?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Byte;
  j: Integer;
begin
  Edit1.Text := '';
 
  for i := 1 to 20 do // Passwortlänge aus 20 Zeichen begrenzen
  begin
    j:=Random(UTF8Length(Charset)) + 1;
    Edit1.Text := Edit1.Text + UTF8Copy(charset, j, 1)// zufälliges Zeichen aus Charset wählen
  end;
end;


Das "j" hab ich nur der Übersichtlichkeit wegen eingebaut.
mfg Ingo

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Mathias »

Ich verstehe nicht ganz, was es mit der (Byte-)Länge der einzelnen Zeichen auf sich haben soll.

Dieses Beispiel demonstriert, das ein Zeichen nicht immer ein Byte lang ist.

Code: Alles auswählen

program project1;
 
const
  //  ae:char='ä';   geht nicht, ä kann nicht in einem Byte dargestellt werden
 
  ae: char = 'a';
 
  procedure Ausgabe(s: string);
  var
    i: integer;
  begin
    Write('L=', Length(s), '  Zeichen:', s, '  Bin:');
    for i := 1 to Length(s) do begin
      Write(byte(s[i]): 2, ' ');
    end;
    Writeln;
  end;
 
begin
  Ausgabe('a');
  Ausgabe('o');
  Ausgabe('u');
  Ausgabe('ä');
  Ausgabe('ö');
  Ausgabe('ü');
  Ausgabe('ॵ');
  Readln;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Indexierung von Elementen aus Strings fehlerhaft?

Beitrag von Dee »

creed steiger hat geschrieben:
Dee hat geschrieben:
@theo: Solche Zeichen wären vielleicht auch interessant, aber ich denke nicht, dass es Log-Ins gibt, die diese zulassen würden. Du kannst mich gerne eines Besseren belehren.


z.B.
http://www.freepascal.ru/forum/


Verwenden denn die Russen solche Zeichen für die Log-Ins? Wenn ja, dann müsste ich meinen Zeichenvorrat stark erweitern und das wäre mir zu viel Aufwand. Latein, Sonderzeichen und Ziffern sollten ausreichen.

@shokwave: Vielen Dank! Ich wusste nicht, dass es solch eine Unit gibt. Woher auch? Ich bin noch zu sehr an Delphi gewohnt, obwohl ich schon einige Monate mit Lazarus arbeite. Wenn ich wieder ein ähnliches Problem haben sollte, dann werde ich mich zuerst nach einer passenden Unit erkundigen.

MfG
-- Dee

Antworten