Aufgrund der täglichen Arbeit nutzte die Einheit Serv-U, um einen FTP-Server einzurichten. Nach der Übernahme stellte sich jedoch heraus, dass dieser FTP-Server für die Öffentlichkeit und viele Benutzer zugänglich war Es wurden keine Passwörter festgelegt. Wenn jeder ein Passwort festlegen muss und es auf dem Server festgelegt werden muss, heißt das dann nicht, dass jeder dem Administrator sein Passwort mitteilen muss? Schließlich sind viele Menschen daran gewöhnt, dasselbe Passwort zu verwenden. Was zu tun? Der beste Weg ist natürlich, eine Webseite bereitzustellen, auf der die Passwortänderungsfunktion bereitgestellt wird.
Gehen Sie einfach online und überprüfen Sie es. Eine Methode besteht darin, die von Serv-U selbst bereitgestellte ODBC-Funktion zu verwenden, die Datenbank zum Speichern von Passwörtern zu verwenden und die Datenbank direkt zu betreiben, um die Passwortänderungsfunktion zu realisieren machbar. Da dieser FTP-Server seit einem Jahr läuft und fast 60 Benutzer hat, ist die Fehlerwahrscheinlichkeit beim Übertragen dieser Benutzer aus der INI-Datei in die Datenbank immer noch relativ hoch.
Als Erstes gilt es herauszufinden, wie die Benutzerinformationen von Serv-U in der INI-Datei gespeichert werden und wie das Passwort verschlüsselt wird. Die Struktur der INI-Datei ist relativ einfach. Um das Passwort zu ändern, suchen Sie einfach den Abschnitt, der mit [Benutzer=@Benutzer-ID|1] beginnt, und ändern Sie den Wert des Passwortschlüssels darunter. @UserID bezieht sich auf die Anmelde-ID des Benutzers.
1[GLOBAL]
2Version=6.1.0.5
3PacketTimeOut=300
4
5
6
7[Domäne1]
8Benutzer1=
9Benutzer2=
10Benutzer3=
11
12
13
14[USER=abc|1]
15Passwort=niE383DC3710266ECAE04A6B3A18A2966D
16HomeDir=D:
17AlwaysAllowLogin=1
18ChangePassword=1
19TimeOut=600
20Note1="Vom Assistenten erstelltes Konto"
21Access1=D:
zweiundzwanzig
dreiundzwanzig
Die Verschlüsselungsmethode des Benutzerpassworts finden Sie in der Wissensdatenbank der offiziellen Website von Ser-U
http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
Manuelles Eingeben verschlüsselter Passwörter in die Datei ServUDaemon.ini
Um ein verschlüsseltes Passwort zu generieren, werden zunächst zwei zufällige Zeichen (das „Salt“ – im Bereich a..z, A..Z) am Anfang des Klartext-Passworts hinzugefügt. Dieses wird dann mit MD5 gehasht und das Ergebnis Das Ergebnis wird als Klartext geschrieben, beginnend mit den 2 Salt-Zeichen, gefolgt vom hexadezimalen Hash.
Für ein Benutzerkonto sieht dies in der INI-Datei so aus:
Passwort=cb644FB1F31184F8D3D169B54B3D46AB1A
Der Salt ist die Zeichenfolge „cb“, der MD5-Hash lautet „644FB1F31184F8D3D169B54B3D46AB1A“.
Bei der Überprüfung des Passworts eines Benutzers wird Serv-U das Gleiche tun. Es analysiert das Salt aus dem gespeicherten Passwort des Benutzers (d. h. „cb“ in diesem Fall) und stellt es voran Es ist das Passwort, das der Benutzer ihm vom Client gesendet hat, MD5 hasht es und vergleicht das Ergebnis mit dem gespeicherten Hash. Wenn die Werte gleich sind, ist das eingegebene Passwort korrekt.
Die Verschlüsselungsmethode besteht darin, zwei Buchstaben zufällig zu generieren, dann die Buchstaben und das Passwort zusammenzufügen und dann ihre MD5-Werte zu ermitteln. Schließlich werden die zufälligen Buchstaben vor den MD5-Wert gesetzt, um das verschlüsselte Passwort zu erhalten.
Als Nächstes können Sie ein Programm schreiben, das auf der obigen Analyse basiert und Online-Änderungen implementiert.
1 /**//// <Zusammenfassung>
2 /// Holen Sie sich den MD5-Wert der angegebenen Zeichenfolge
3 /// </summary>
4 /// <param name="strContent"></param>
5 /// <returns></returns>
6 öffentlicher String MD5(String strContent)
7 {
8 System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
9 byte[] bytes = System.Text.Encoding.UTF8.GetBytes( strContent );
10 Bytes = md5.ComputeHash( Bytes );
11 md5.Clear();
12 string ret = "";
13 for(int i=0; i<bytes.Length; i++)
14 {
15 ret += Convert.ToString(bytes[i],16).PadLeft(2,'0');
16}
17 return ret.PadLeft(32,'0').ToUpper();
18}
19
20
21 /**//// <Zusammenfassung>
22 /// Erzeuge eine zufällige Zeichenfolge, die Länge der Zeichenfolge beträgt 2
23 /// </summary>
24 /// <returns></returns>
25 öffentlicher String GetRandomString()
26 {
27 string strReturn = "";
28 Random ran = new Random();
29 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
30 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
31 return strReturn;
32}
33
34 //Generieren Sie ein verschlüsseltes Passwort aus den angegebenen Zufallsbuchstaben und dem Login-Passwort
35 öffentliche Zeichenfolge CreateCryPassword( Zeichenfolge strFrontChars, Zeichenfolge strPassword)
36 {
37 return strFrontChars + MD5( strFrontChars + strPassword ).ToUpper().Trim();
38 }
39
40 /**//// <Zusammenfassung>
41 /// Klicken Sie auf das Ereignis „Passwort ändern“, bei dem das Passwort geändert wird.
42 /// </summary>
43 /// <param name="sender"></param>
44 /// <param name="e"></param>
45 private void btnModifyPwd_Click(object sender, System.EventArgs e)
46 {
47 string strUserID = txtLoginID.Text;
48 if(strUserID == String.Empty)
49 {
50 controlMessage.InnerHtml = „Benutzername darf nicht leer sein“;
51 Rückkehr;
52 }
53
54 //Bestimmen Sie, ob die beiden Passworteingaben identisch sind
55 if( txtNewPassword.Text != txtConfirmPassword.Text )
56 {
57 controlMessage.InnerHtml = „Die zweimal eingegebenen Passwörter sind inkonsistent, bitte erneut eingeben“;
58 Rückkehr;
59 }
60
61 IniFile ini = new IniFile( _strServUDaemonPath );
62 string strSectionValue = "USER=" + strUserID.Trim() + "|1";
63
64 //Bestimmen Sie, ob der Benutzer existiert, indem Sie das HomeDir des angegebenen Benutzers lesen
65 if( ini.ReadString( strSectionValue, "HomeDir", "" ) == "" )
66 {
67 controlMessage.InnerHtml = „Der angegebene Benutzer existiert nicht“;
68 Rückkehr;
69 }
70
71 //Beginne mit der Feststellung, ob das Passwort korrekt ist
72 string strPassword = ini.ReadString( strSectionValue, "Password", "" );
73
74 string strPasswordFrontTwoChars;
75 bool bPasswordRight = false;
76 if(strPassword.Length > 2)
77 {
78 //Lesen Sie die zufälligen Buchstaben, die im Passwort enthalten sind
79 strPasswordFrontTwoChars = strPassword.Substring(0, 2);
80 if( CreateCryPassword( strPasswordFrontTwoChars, txtOldPassword.Text ) == strPassword )
81 {//Passwort-Übereinstimmungen
82 bPasswordRight = true;
83}
84 sonst
85 {//Passwort stimmt nicht überein
86 bPasswordRight = false;
87 }
88}
89 else if( strPassword == txtOldPassword.Text) //Das ursprüngliche Passwort ist leer
90 {
91 bPasswordRight = true;
92 }
93 sonst
94 {
95 bPasswordRight = false;
96 }
97
98 if( bPasswordRight )
99 {
100 // Das Passwort ist korrekt. Schreiben Sie ein neues Passwort und richten Sie es so ein, dass neue Einstellungen automatisch geladen werden, sodass sie bei der nächsten Änderung weiterhin gültig sind.
101 ini.WriteString( strSectionValue, "Password", CreateCryPassword( GetRandomString(), txtNewPassword.Text ) );
102 controlMessage.InnerHtml = „Passwortänderung abgeschlossen“;
103}
104 sonst
105 {
106 controlMessage.InnerHtml = „Originalpasswort ist falsch“;
107 }
108
109 }
Die Variable _strServUDaemonPath im obigen Code wird verwendet, um den Pfad zu speichern, in dem sich die Datei ServUDaemon.ini befindet. Dieser Wert kann über die Web.Config-Einstellung im PageLoad-Ereignis abgerufen werden.
Aber damit war es noch nicht getan. Nach dem Test wurde festgestellt, dass ein schwerwiegendes Problem vorliegt: Nach dem Ändern des Passworts kann das geänderte Passwort nur durch einen Neustart von Serv-U wirksam werden. Bedeutet das nicht, dass es nutzlos ist? Der Administrator kann den Server nicht immer neu starten, damit die Passwortänderung wirksam wird.
Als ich noch einmal zur offiziellen Wissensdatenbank von Serv-U zurückkehrte, fand ich den folgenden Inhalt:
Manuelles Aktualisieren der Datei ServUDaemon.ini
Wenn Änderungen direkt an der Datei ServUDaemon.ini vorgenommen werden, fügen Sie die folgende Zeile im Bereich „Global“ in der INI-Datei hinzu.
Serv
-U überprüft regelmäßig die INI-Datei auf diese Einstellung Alle gespeicherten Einstellungen für jede Domäne auf dem Server. Dadurch kann Serv-U die Änderungen erkennen
, ohne dass es neu gestartet werden muss. Dadurch wird der Eintrag „ReloadSettings=True“ entfernt Beim nächsten Mal werden Änderungen vorgenommen.
Mit anderen Worten: Solange Sie den Schlüssel ReloadSettings im GLOBAL-Abschnitt der INI-Datei hinzufügen und seinen Wert auf True setzen, können Sie das Passwort nach der Änderung automatisch aktualisieren. Ändern Sie also einfach den Originalcode und fügen Sie den folgenden Code zwischen den Zeilen 101 und 102 ein:
ini.WriteString( "GLOBAL", "ReloadSettings", "True" );
Zu diesem Zeitpunkt ist eine Webseite zum Online-Ändern des Serv-U-Passworts fertig.
IniFile im Programm ist eine Klasse, die die API-Operation für INI-Dateien kapselt. Sie muss lediglich das Lesen und Schreiben von Zeichenfolgen implementieren.