﻿1
00:00:01,120 --> 00:00:02,370
‫Kursleiter: In dieser

2
00:00:02,370 --> 00:00:06,430
‫Vorlesung werden wir also die Passwörter unserer Benutzer in der Datenbank verwalten.

3
00:00:06,430 --> 00:00:08,790
‫Und damit meine ich, zuerst zu

4
00:00:08,790 --> 00:00:12,660
‫überprüfen, ob das eingegebene Passwort mit dem bestätigten Passwort übereinstimmt und

5
00:00:12,660 --> 00:00:16,380
‫dann auch das Passwort in der Datenbank zu verschlüsseln, um

6
00:00:16,380 --> 00:00:18,633
‫es vor Angriffen zu schützen.

7
00:00:20,320 --> 00:00:22,330
‫Das erste, was wir tun

8
00:00:22,330 --> 00:00:26,690
‫werden, ist zu überprüfen, ob die beiden eingegebenen Passwörter gleich sind.

9
00:00:26,690 --> 00:00:28,840
‫Und das geht am

10
00:00:28,840 --> 00:00:31,760
‫besten hier in der Passwortbestätigung, okay?

11
00:00:31,760 --> 00:00:36,283
‫Also schreiben wir unseren benutzerdefinierten Validator dafür, in Ordnung?

12
00:00:38,480 --> 00:00:41,890
‫Denken Sie also daran, wir verwenden die Eigenschaft validieren

13
00:00:41,890 --> 00:00:44,270
‫und dann, da wir eine Funktion

14
00:00:44,270 --> 00:00:48,420
‫und auch eine Fehlermeldung erstellen möchten, öffnen wir hier ein neues Objekt

15
00:00:49,480 --> 00:00:51,990
‫und erstellen dann dort einen Validator, der

16
00:00:51,990 --> 00:00:53,920
‫die Funktion sein wird

17
00:00:53,920 --> 00:00:56,370
‫und fangen wir tatsächlich mit diesem an.

18
00:00:56,370 --> 00:00:58,780
‫Denken Sie also daran, dass wir hier

19
00:00:58,780 --> 00:01:01,770
‫nur eine einfache Callback-Funktion angeben müssen, die dann aufgerufen wird,

20
00:01:01,770 --> 00:01:03,853
‫wenn das neue Dokument erstellt wird.

21
00:01:04,940 --> 00:01:06,163
‫Also, function,

22
00:01:07,210 --> 00:01:10,320
‫und auch hier können wir keine Pfeilfunktion verwenden,

23
00:01:10,320 --> 00:01:13,183
‫weil wir tatsächlich das disk-Schlüsselwort verwenden müssen.

24
00:01:14,690 --> 00:01:15,523
‫Okay?

25
00:01:16,560 --> 00:01:19,180
‫Denken Sie also daran, dass wir von

26
00:01:19,180 --> 00:01:21,470
‫der Validierungsfunktion entweder true oder

27
00:01:21,470 --> 00:01:23,960
‫false zurückgeben und wenn der Rückgabewert

28
00:01:23,960 --> 00:01:27,550
‫false ist, bedeutet dies, dass wir einen Validierungsfehler erhalten, okay?

29
00:01:27,550 --> 00:01:29,630
‫Und natürlich, wenn es stimmt, dann nicht.

30
00:01:29,630 --> 00:01:33,820
‫Was wir hier also wollen, ist zu sagen, dass das

31
00:01:33,820 --> 00:01:37,643
‫aktuelle Element, also password Confirm, diesem Punkt-Passwort entspricht, also

32
00:01:37,643 --> 00:01:40,760
‫Passwort Confirm, diesem Punkt-Passwort entspricht, und das

33
00:01:40,760 --> 00:01:42,350
‫ist es tatsächlich!

34
00:01:42,350 --> 00:01:46,510
‫Wenn also zum Beispiel die Passwortbestätigung A-B-C ist und

35
00:01:46,510 --> 00:01:49,520
‫das Passwort auch A-B-C ist, dann wird

36
00:01:49,520 --> 00:01:52,530
‫dies natürlich true zurückgeben, in Ordnung?

37
00:01:52,530 --> 00:01:54,330
‫Und so wird die Validierung

38
00:01:54,330 --> 00:01:56,550
‫bestanden und es wird kein Fehler auftreten.

39
00:01:56,550 --> 00:02:00,440
‫Aber wenn das anfängliche Passwort, sagen wir, X-Y-Z ist,

40
00:02:00,440 --> 00:02:02,860
‫dann wird dies natürlich false

41
00:02:02,860 --> 00:02:05,820
‫zurückgeben und wir haben einen Validierungsfehler, okay?

42
00:02:05,820 --> 00:02:08,660
‫Also, ganz einfach, aber wir müssen

43
00:02:08,660 --> 00:02:12,320
‫bedenken, dass das nur beim Speichern funktioniert, okay?

44
00:02:12,320 --> 00:02:13,950
‫Darüber habe ich also schon

45
00:02:13,950 --> 00:02:17,840
‫einmal gesprochen, als wir den benutzerdefinierten Validator für das Tourmodell verwendet haben, oder?

46
00:02:17,840 --> 00:02:19,740
‫Aber ich erinnere Sie hier

47
00:02:19,740 --> 00:02:24,120
‫noch einmal daran, weil dies hier in diesem Punkt absolut entscheidend ist, okay?

48
00:02:24,120 --> 00:02:26,423
‫Also lassen Sie es mich hier für Sie aufschreiben.

49
00:02:27,739 --> 00:02:30,410
‫(Tastaturklick) Beim

50
00:02:30,410 --> 00:02:32,050
‫Speichern.

51
00:02:32,050 --> 00:02:32,883
‫Okay?

52
00:02:32,883 --> 00:02:35,740
‫Und aus diesem Grund müssen wir immer dann, wenn wir

53
00:02:35,740 --> 00:02:38,250
‫einen Benutzer aktualisieren möchten, immer auch speichern und

54
00:02:38,250 --> 00:02:41,010
‫nicht zum Beispiel einen finden und aktualisieren, wie wir

55
00:02:41,010 --> 00:02:43,310
‫es bei unseren Touren getan haben, okay?

56
00:02:43,310 --> 00:02:45,570
‫Denken wir also daran, wenn

57
00:02:45,570 --> 00:02:48,730
‫wir den Rest des Codes für den Rest des

58
00:02:48,730 --> 00:02:51,670
‫Abschnitts und insbesondere für die Aktualisierung schreiben, okay?

59
00:02:51,670 --> 00:02:54,400
‫Denn sagen wir, wir haben das Passwort des Benutzers

60
00:02:54,400 --> 00:02:56,320
‫einfach mit einem regelmäßigen Update aktualisiert.

61
00:02:56,320 --> 00:02:58,910
‫Dann würde diese Passwortbestätigung, die wir hier

62
00:02:58,910 --> 00:03:01,540
‫haben, in diesem Fall nicht mehr funktionieren, okay?

63
00:03:01,540 --> 00:03:04,670
‫Und das kann natürlich nicht passieren, okay?

64
00:03:04,670 --> 00:03:08,410
‫Denken Sie also daran, dass dies nur funktioniert, wenn

65
00:03:08,410 --> 00:03:12,920
‫wir ein neues Objekt erstellen, also bei Punkterstellung oder beim Speichern.

66
00:03:12,920 --> 00:03:13,753
‫Okay?

67
00:03:13,753 --> 00:03:15,524
‫Also, beim Erstellen und

68
00:03:15,524 --> 00:03:18,550
‫Speichern, Also beim Erstellen und Speichern, In

69
00:03:18,550 --> 00:03:19,383
‫Ordnung?

70
00:03:19,383 --> 00:03:22,830
‫Also erstellen wir ein neues Objekt mit create, richtig?

71
00:03:22,830 --> 00:03:25,431
‫Also, genau hier, habe eine Punkterstellung verwendet Also,

72
00:03:25,431 --> 00:03:27,100
‫genau hier, habe eine Punkterstellung

73
00:03:27,100 --> 00:03:28,463
‫verwendet, aber erinnere

74
00:03:28,463 --> 00:03:31,143
‫mich, wie ich Ihnen auch gezeigt habe, dass

75
00:03:33,100 --> 00:03:35,160
‫wir einen Benutzer-Punktspeicher verwenden können, richtig?

76
00:03:35,160 --> 00:03:38,470
‫Und tatsächlich können wir auch einen Benutzerpunktspeicher verwenden,

77
00:03:38,470 --> 00:03:41,550
‫um den Benutzer zu aktualisieren, in Ordnung?

78
00:03:41,550 --> 00:03:43,593
‫Aber dazu später noch einmal mehr.

79
00:03:44,820 --> 00:03:45,810
‫Okay?

80
00:03:45,810 --> 00:03:50,063
‫Lassen Sie uns diese Validierung jetzt also hier ausprobieren, okay?

81
00:03:51,230 --> 00:03:53,280
‫Versuchen wir also zunächst einmal, einen

82
00:03:53,280 --> 00:03:55,210
‫neuen Benutzer mit diesen Daten

83
00:03:55,210 --> 00:03:57,660
‫hier anzulegen, was nicht funktionieren sollte, da wir

84
00:03:57,660 --> 00:04:01,020
‫bereits einen Benutzer mit dieser E-Mail-Adresse haben und wir sagten,

85
00:04:01,020 --> 00:04:03,290
‫dass dieser eindeutig sein sollte und daher

86
00:04:03,290 --> 00:04:04,590
‫nicht funktionieren sollte.

87
00:04:06,330 --> 00:04:12,210
‫Okay, und natürlich unser Fehler mit doppeltem Schlüssel, oder?

88
00:04:12,210 --> 00:04:14,170
‫Wenn Sie jetzt in der Produktion

89
00:04:14,170 --> 00:04:17,040
‫wären, würden wir natürlich schon unseren schön formatierten Fehler bekommen,

90
00:04:17,040 --> 00:04:19,620
‫den wir im letzten Abschnitt erstellt haben, oder?

91
00:04:19,620 --> 00:04:23,730
‫Aber im Moment befinden wir uns in der Entwicklung und das ist der Fehler, den wir

92
00:04:23,730 --> 00:04:25,383
‫definiert haben, den wir sehen wollen.

93
00:04:26,510 --> 00:04:27,343
‫Okay?

94
00:04:28,440 --> 00:04:30,890
‫Lassen Sie uns hier einfach eine andere E-Mail

95
00:04:30,890 --> 00:04:33,060
‫verwenden und da wir hier an

96
00:04:33,060 --> 00:04:36,593
‫der E-Mail arbeiten, sehen wir uns auch an, wie die E-Mail-Adressvalidierung funktioniert.

97
00:04:37,650 --> 00:04:40,833
‫Nehmen wir an, wir haben dies als unsere E-Mail-Adresse angegeben.

98
00:04:42,190 --> 00:04:47,663
‫Daher sehen wir den Fehler "Bitte geben Sie eine gültige E-Mail an. " Okay?

99
00:04:48,660 --> 00:04:51,320
‫Testen wir es also einfach so, weil ich denke, dass

100
00:04:51,320 --> 00:04:53,120
‫dies auch nicht gültig sein sollte.

101
00:04:53,120 --> 00:04:55,043
‫Vielleicht ist es das, aber mal sehen.

102
00:04:56,170 --> 00:04:57,840
‫Und ja, eigentlich liegt es

103
00:04:57,840 --> 00:05:01,050
‫nicht daran, dass es keine Domainnamen mit nur einem Buchstaben gibt, okay?

104
00:05:01,050 --> 00:05:03,990
‫Dieser Validator ist also ziemlich spezifisch,

105
00:05:03,990 --> 00:05:05,890
‫also wirklich gut.

106
00:05:05,890 --> 00:05:09,080
‫Wenn wir es jetzt so machen, dann sollte es natürlich funktionieren.

107
00:05:09,080 --> 00:05:11,000
‫Aber egal, was wir

108
00:05:11,000 --> 00:05:13,860
‫hier testen wollten, sind diese verschiedenen Passwörter, okay?

109
00:05:13,860 --> 00:05:15,460
‫Und ich erinnere mich

110
00:05:15,460 --> 00:05:18,493
‫jetzt, dass wir eigentlich keine Fehlermeldung erstellt haben, glaube ich.

111
00:05:19,430 --> 00:05:21,070
‫Und ja, wir haben es nicht getan.

112
00:05:21,070 --> 00:05:22,993
‫Und so fügen wir das auch hier hinzu.

113
00:05:25,120 --> 00:05:26,113
‫Also Nachricht,

114
00:05:28,510 --> 00:05:29,510
‫sind nicht die

115
00:05:30,930 --> 00:05:31,803
‫gleichen.

116
00:05:32,900 --> 00:05:33,733
‫Okay.

117
00:05:35,580 --> 00:05:38,390
‫Also lasst uns hier etwas hinzufügen, egal.

118
00:05:38,390 --> 00:05:42,613
‫Passwörter sind also nicht gleich Passwörter, okay?

119
00:05:43,460 --> 00:05:45,233
‫So perfekt.

120
00:05:45,233 --> 00:05:48,333
‫Und jetzt sollte natürlich unsere Validierung bestanden sein.

121
00:05:49,640 --> 00:05:53,690
‫Und tatsächlich ist es so und wir haben unseren neuen Benutzer erstellt.

122
00:05:53,690 --> 00:05:55,900
‫Lassen Sie uns hier zu

123
00:05:55,900 --> 00:05:58,640
‫Compass gehen, einen Blick darauf werfen und ihn

124
00:05:58,640 --> 00:06:02,953
‫dann tatsächlich löschen, damit ich später weitere Benutzer mit derselben E-Mail erstellen kann.

125
00:06:04,330 --> 00:06:05,163
‫Gut?

126
00:06:05,163 --> 00:06:07,310
‫Und diesen ganzen Kram wollen wir

127
00:06:07,310 --> 00:06:09,990
‫sowieso nicht hier haben, also all diese Testbenutzer, okay?

128
00:06:09,990 --> 00:06:13,330
‫Aber jetzt besteht der nächste Schritt darin, diese einfachen

129
00:06:13,330 --> 00:06:15,560
‫Passwörter, die wir gerade in unserer

130
00:06:15,560 --> 00:06:17,570
‫Datenbank speichern, tatsächlich zu verschlüsseln.

131
00:06:17,570 --> 00:06:19,940
‫Wie ich im letzten Video erwähnt

132
00:06:19,940 --> 00:06:21,950
‫habe, ist es bei

133
00:06:21,950 --> 00:06:24,220
‫der Arbeit mit Authentifizierung eines

134
00:06:24,220 --> 00:06:29,090
‫der grundlegendsten Prinzipien, niemals einfache Passwörter in einer Datenbank zu speichern, okay?

135
00:06:29,090 --> 00:06:33,170
‫Das ist also absolut nicht akzeptabel, okay?

136
00:06:33,170 --> 00:06:36,650
‫Wir sollten also wirklich immer die Passwörter der Benutzer verschlüsseln, denn stellen

137
00:06:36,650 --> 00:06:38,510
‫Sie sich vor, dass ein

138
00:06:38,510 --> 00:06:41,250
‫Hacker aus irgendeinem Grund Zugriff auf die Datenbank erhält.

139
00:06:41,250 --> 00:06:44,880
‫Wenn dann dort die Passwörter im Klartext hinterlegt sind, dann kann

140
00:06:44,880 --> 00:06:47,550
‫er sich einfach als beliebiger Benutzer einloggen

141
00:06:47,550 --> 00:06:49,720
‫und dann machen was er

142
00:06:49,720 --> 00:06:52,730
‫wirklich will und unter Umständen viel Schaden anrichten, okay?

143
00:06:52,730 --> 00:06:55,770
‫Und das müssen wir unbedingt verhindern.

144
00:06:55,770 --> 00:06:58,563
‫Und so lassen Sie uns jetzt vorangehen und dies implementieren.

145
00:06:59,870 --> 00:07:03,610
‫Wo macht man das nun eigentlich am besten?

146
00:07:03,610 --> 00:07:07,270
‫Nun, ich würde argumentieren, dass das Modell immer der beste

147
00:07:07,270 --> 00:07:10,160
‫Ort für diese Art von Funktionalität ist.

148
00:07:10,160 --> 00:07:12,110
‫Also in diesem Fall die Verschlüsselung,

149
00:07:12,110 --> 00:07:14,960
‫weil sie wirklich mit den Daten selbst zu tun

150
00:07:14,960 --> 00:07:16,730
‫hat und sie daher am

151
00:07:16,730 --> 00:07:19,070
‫Modell und nicht am Controller liegen sollte, okay?

152
00:07:19,070 --> 00:07:22,022
‫Behalten Sie auch hier die Philosophie der dicken Modelle

153
00:07:22,022 --> 00:07:24,040
‫und der dünnen Controller im Hinterkopf.

154
00:07:24,040 --> 00:07:24,873
‫Gut?

155
00:07:27,260 --> 00:07:31,170
‫Wie werden wir nun diese Verschlüsselung implementieren?

156
00:07:31,170 --> 00:07:33,660
‫Nun, dies ist ein weiterer perfekter Anwendungsfall

157
00:07:33,660 --> 00:07:36,050
‫für die Verwendung von Mongoose-Middleware.

158
00:07:36,050 --> 00:07:37,430
‫Und die, die

159
00:07:37,430 --> 00:07:39,210
‫wir verwenden werden, ist eine Pre-Save-Middleware.

160
00:07:39,210 --> 00:07:42,630
‫Also im Grunde Dokument-Middleware, okay?

161
00:07:42,630 --> 00:07:47,630
‫Denken Sie also daran, dass wir das im Schema definiert haben, okay?

162
00:07:47,760 --> 00:07:50,130
‫Und in diesem Fall wollen wir einen

163
00:07:50,130 --> 00:07:52,928
‫Pre-Hook setzen, also eine Pre-Middleware auf Save, in Ordnung?

164
00:07:52,928 --> 00:07:54,490
‫Also eine Pre-Middleware beim Speichern, in Ordnung?

165
00:07:54,490 --> 00:07:56,750
‫Und der Grund, warum wir das

166
00:07:56,750 --> 00:07:58,320
‫so machen, ist, dass

167
00:07:58,320 --> 00:08:01,240
‫die Middleware-Funktion, die wir hier spezifizieren werden, also die

168
00:08:01,240 --> 00:08:03,660
‫Verschlüsselung, zwischen dem Moment, in dem wir

169
00:08:03,660 --> 00:08:05,990
‫diese Daten erhalten, und dem Moment, in

170
00:08:05,990 --> 00:08:09,340
‫dem sie tatsächlich auf dem gespeichert werden, stattfindet Datenbank, okay?

171
00:08:09,340 --> 00:08:12,200
‫Hier läuft also die Pre-Save-Middleware.

172
00:08:12,200 --> 00:08:15,600
‫Zwischen dem Abrufen der Daten und dem Speichern in der Datenbank.

173
00:08:15,600 --> 00:08:19,210
‫Das ist also der perfekte Zeitpunkt, um die Daten zu manipulieren.

174
00:08:19,210 --> 00:08:20,420
‫Gut?

175
00:08:20,420 --> 00:08:21,253
‫Also, eine

176
00:08:22,480 --> 00:08:26,010
‫Funktion, und dann denken Sie daran, dass wir Zugriff

177
00:08:26,010 --> 00:08:29,740
‫auf die nächste Funktion haben, um die nächste Middleware aufzurufen.

178
00:08:29,740 --> 00:08:33,220
‫Okay, jetzt wollen wir das Passwort eigentlich

179
00:08:33,220 --> 00:08:37,400
‫nur verschlüsseln, wenn das Passwort-Feld auch tatsächlich aktualisiert wurde, okay?

180
00:08:37,400 --> 00:08:40,900
‫Also im Grunde nur, wenn das Passwort wirklich geändert oder

181
00:08:40,900 --> 00:08:43,370
‫auch neu erstellt wird, in Ordnung?

182
00:08:43,370 --> 00:08:46,890
‫Denn stellen Sie sich vor, der Benutzer aktualisiert nur die E-Mail.

183
00:08:46,890 --> 00:08:48,340
‫Dann wollen wir

184
00:08:48,340 --> 00:08:51,760
‫das Passwort dann natürlich nicht noch einmal verschlüsseln, oder?

185
00:08:51,760 --> 00:08:54,420
‫Und so können wir das mit Mongoose tun.

186
00:08:54,420 --> 00:08:58,130
‫Und so werden wir sagen, wenn und dann dies, das

187
00:08:58,130 --> 00:09:00,840
‫sich auf das aktuelle Dokument bezieht, richtig?

188
00:09:00,840 --> 00:09:03,070
‫Und so wird in diesem Fall der aktuelle

189
00:09:03,070 --> 00:09:04,583
‫Benutzer und dann geändert.

190
00:09:06,690 --> 00:09:07,523
‫Okay?

191
00:09:07,523 --> 00:09:10,670
‫Wir haben also eine Methode für alle Dokumente, die wir

192
00:09:10,670 --> 00:09:13,260
‫verwenden können, wenn ein bestimmtes Feld geändert wurde.

193
00:09:13,260 --> 00:09:16,270
‫Hier müssen wir also den Namen des Felds eingeben,

194
00:09:16,270 --> 00:09:18,773
‫also "Passwort. " Okay?

195
00:09:18,773 --> 00:09:21,080
‫Im Grunde wollen wir hier also

196
00:09:21,080 --> 00:09:24,440
‫sagen, dass, wenn das Passwort nicht geändert wurde, in

197
00:09:24,440 --> 00:09:27,540
‫diesem Fall einfach von dieser Funktion zurückkehren und

198
00:09:27,540 --> 00:09:30,520
‫keinen anderen Code ausführen, der hier enthalten

199
00:09:30,520 --> 00:09:32,320
‫ist, und dann aufrufen

200
00:09:33,160 --> 00:09:34,863
‫die nächste Middleware.

201
00:09:35,834 --> 00:09:36,667
‫Okay?

202
00:09:37,930 --> 00:09:41,170
‫Wenn das Passwort also nicht geändert wurde, verlassen wir

203
00:09:41,170 --> 00:09:42,810
‫diese Funktion einfach und

204
00:09:42,810 --> 00:09:44,600
‫rufen die nächste Middleware auf.

205
00:09:44,600 --> 00:09:46,770
‫Andernfalls führen wir dann den Code aus,

206
00:09:46,770 --> 00:09:48,580
‫den ich hier einfügen werde.

207
00:09:48,580 --> 00:09:51,270
‫Und jetzt ist es endlich an der Zeit, das

208
00:09:51,270 --> 00:09:55,200
‫Passwort tatsächlich zu verschlüsseln, oder wie wir auch sagen können, das Passwort zu hashen, okay?

209
00:09:55,200 --> 00:09:58,490
‫Sie werden also ständig den Begriff "Hash" oder

210
00:09:58,490 --> 00:10:01,890
‫"Hashing" sehen und das bedeutet im Grunde auch Verschlüsselung, okay?

211
00:10:01,890 --> 00:10:05,440
‫Jetzt werden wir diese Verschlüsselung oder Hashing

212
00:10:05,440 --> 00:10:08,580
‫mit einem sehr bekannten und

213
00:10:08,580 --> 00:10:13,230
‫gut untersuchten und sehr beliebten Hashing-Algorithmus namens bcrypt durchführen.

214
00:10:13,230 --> 00:10:14,290
‫Okay?

215
00:10:14,290 --> 00:10:18,200
‫Dieser Algorithmus wird also zuerst unser Passwort salzen und dann hashen,

216
00:10:18,200 --> 00:10:21,130
‫um es wirklich stark zu machen, um es

217
00:10:21,130 --> 00:10:23,760
‫vor Bruteforce-Angriffen zu schützen, in Ordnung?

218
00:10:23,760 --> 00:10:25,280
‫Aus diesem Grund

219
00:10:25,280 --> 00:10:27,600
‫muss die Verschlüsselung wirklich stark sein.

220
00:10:27,600 --> 00:10:30,360
‫Denn Bruteforce-Angriffe könnten versuchen, ein bestimmtes

221
00:10:30,360 --> 00:10:34,040
‫Passwort zu erraten, wenn es nicht wirklich stark verschlüsselt ist.

222
00:10:34,040 --> 00:10:37,990
‫Und denken Sie daran, wie ich sagte, dass bcrypt unser

223
00:10:37,990 --> 00:10:40,950
‫Passwort salzt und das bedeutet nur, dass es

224
00:10:40,950 --> 00:10:44,500
‫dem Passwort eine zufällige Zeichenfolge hinzufügt, damit zwei gleiche

225
00:10:44,500 --> 00:10:47,430
‫Passwörter nicht denselben Hash generieren, okay?

226
00:10:47,430 --> 00:10:48,490
‫Sinn ergeben?

227
00:10:48,490 --> 00:10:51,520
‫Ich werde jetzt nicht auf alle kryptografischen Details eingehen, wie

228
00:10:51,520 --> 00:10:53,940
‫das wirklich hinter den Kulissen funktioniert

229
00:10:53,940 --> 00:10:56,850
‫und warum wir ein so komplexes System brauchen, okay?

230
00:10:56,850 --> 00:11:00,140
‫Aber natürlich können Sie online alles über bcrypt lesen.

231
00:11:00,140 --> 00:11:02,830
‫Da gibt es wirklich viel

232
00:11:02,830 --> 00:11:05,290
‫Interessantes zu entdecken, oder?

233
00:11:05,290 --> 00:11:09,270
‫Wie auch immer, lassen Sie uns jetzt fortfahren und das bcrypt

234
00:11:09,270 --> 00:11:12,133
‫js-Paket verwenden, um diesen Algorithmus zu verwenden.

235
00:11:13,790 --> 00:11:14,623
‫Also, also

236
00:11:15,560 --> 00:11:16,393
‫npm install,

237
00:11:16,393 --> 00:11:17,660
‫also npm install

238
00:11:19,156 --> 00:11:21,655
‫bcryptjs.

239
00:11:21,655 --> 00:11:22,488
‫Okay?

240
00:11:22,488 --> 00:11:25,410
‫Dies ist im Grunde eine bcrypt-Implementierung

241
00:11:25,410 --> 00:11:26,713
‫für Javascript.

242
00:11:27,650 --> 00:11:28,750
‫Okay?

243
00:11:28,750 --> 00:11:30,720
‫Gehen wir zurück zu unserem Hauptterminal

244
00:11:32,550 --> 00:11:34,513
‫und importieren Sie es hier.

245
00:11:36,092 --> 00:11:40,820
‫Und dieser heißt standardmäßig nur bcrypt, okay?

246
00:11:40,820 --> 00:11:41,873
‫Und nicht bcryptjs.

247
00:11:42,889 --> 00:11:50,163
‫(Tastaturklick) Alles klar.

248
00:11:53,360 --> 00:11:54,193
‫Gut.

249
00:11:54,193 --> 00:11:56,033
‫Und jetzt verwenden wir es tatsächlich.

250
00:11:56,970 --> 00:12:00,293
‫Wir möchten also sagen, dass dieses Punkt-Passwort, also

251
00:12:01,370 --> 00:12:03,510
‫das aktuelle Passwort in diesem

252
00:12:04,590 --> 00:12:07,381
‫Dokument, gleich bcrypt-Punkt-Hash sein sollte, sollte

253
00:12:07,381 --> 00:12:10,214
‫gleich bcrypt-Punkt-Hash sein und dann unser

254
00:12:11,600 --> 00:12:13,100
‫aktuelles Passwort.

255
00:12:14,640 --> 00:12:15,473
‫Okay?

256
00:12:15,473 --> 00:12:19,600
‫Und dann müssen wir hier einen Kostenparameter angeben, okay?

257
00:12:19,600 --> 00:12:22,100
‫Und wir könnten dies tatsächlich auf zwei Arten tun.

258
00:12:22,100 --> 00:12:25,700
‫Der erste Weg besteht also darin, den Salt manuell zu

259
00:12:25,700 --> 00:12:27,740
‫generieren, so dass im Grunde eine

260
00:12:27,740 --> 00:12:29,727
‫zufällige Zeichenfolge zu unserem Passwort

261
00:12:29,727 --> 00:12:33,770
‫hinzugefügt wird, und dann diesen Salt hier in dieser Hash-Funktion zu verwenden.

262
00:12:33,770 --> 00:12:34,603
‫Gut?

263
00:12:34,603 --> 00:12:36,480
‫Aber der Einfachheit halber können

264
00:12:36,480 --> 00:12:39,260
‫wir hier auch einfach einen Kostenparameter an

265
00:12:39,260 --> 00:12:40,620
‫diese Funktion übergeben.

266
00:12:40,620 --> 00:12:42,920
‫Und das ist im Grunde

267
00:12:42,920 --> 00:12:47,360
‫ein Maß dafür, wie CPU-intensiv dieser Vorgang sein wird, in Ordnung?

268
00:12:47,360 --> 00:12:50,230
‫Und der Standardwert hier ist meiner Meinung nach 10,

269
00:12:50,230 --> 00:12:53,130
‫aber im Moment ist es etwas besser, 12 zu

270
00:12:53,130 --> 00:12:55,810
‫verwenden, weil Computer immer leistungsfähiger geworden sind.

271
00:12:55,810 --> 00:12:58,800
‫Wie vor 20 Jahren hätten Sie hier und dann

272
00:12:58,800 --> 00:13:01,170
‫acht verwenden können, etwas später als

273
00:13:01,170 --> 00:13:04,670
‫10, aber im Moment ist es am besten, 12 zu verwenden.

274
00:13:04,670 --> 00:13:06,610
‫Und je höher diese

275
00:13:06,610 --> 00:13:09,610
‫Kosten hier sind, desto CPU-intensiver wird der

276
00:13:09,610 --> 00:13:13,350
‫Prozess und desto besser wird das Passwort verschlüsselt, okay?

277
00:13:13,350 --> 00:13:15,070
‫Und natürlich könnten wir noch höher

278
00:13:15,070 --> 00:13:17,750
‫gehen, aber dann würde es viel zu lange dauern, okay?

279
00:13:17,750 --> 00:13:20,330
‫Und das werde ich Ihnen gleich zeigen.

280
00:13:20,330 --> 00:13:21,163
‫Okay?

281
00:13:21,163 --> 00:13:22,910
‫Aber lassen Sie uns

282
00:13:22,910 --> 00:13:26,060
‫das jetzt tatsächlich beenden, denn hier ist noch etwas übrig.

283
00:13:26,060 --> 00:13:29,040
‫Dieser Hash hier ist also eigentlich die asynchrone Version,

284
00:13:29,040 --> 00:13:31,440
‫aber es gibt auch eine synchrone Version.

285
00:13:31,440 --> 00:13:33,960
‫Aber wie Sie bereits wissen, möchten wir die

286
00:13:33,960 --> 00:13:35,313
‫synchrone Version nicht

287
00:13:35,313 --> 00:13:38,810
‫verwenden, da dies die Ereignisschleife blockiert und dann andere Benutzer

288
00:13:38,810 --> 00:13:41,000
‫daran hindert, die Anwendung zu verwenden.

289
00:13:41,000 --> 00:13:43,350
‫So wie wir es am Anfang gelernt haben.

290
00:13:43,350 --> 00:13:45,230
‫Und so möchten wir

291
00:13:45,230 --> 00:13:48,130
‫natürlich die asynchrone Version verwenden, die diese ist.

292
00:13:48,130 --> 00:13:50,210
‫Und dies wird dann ein

293
00:13:50,210 --> 00:13:53,860
‫Versprechen zurückgeben und dieses Versprechen müssen wir natürlich abwarten.

294
00:13:53,860 --> 00:13:58,860
‫Also müssen wir wait verwenden und dann sagen, dass diese

295
00:13:58,960 --> 00:14:02,513
‫Funktion eine asynchrone Funktion ist, genau so.

296
00:14:04,730 --> 00:14:06,860
‫Lassen Sie uns das hier noch einmal zusammenfassen.

297
00:14:06,860 --> 00:14:09,780
‫Wir möchten unser aktuelles Passwort also grundsätzlich

298
00:14:09,780 --> 00:14:14,780
‫so einrichten, dass diese Version des ursprünglichen Passworts mit Kosten von 12

299
00:14:14,780 --> 00:14:17,500
‫verschlüsselt wird, das Passwort nicht

300
00:14:17,500 --> 00:14:21,690
‫zu leicht knackt werden kann, aber auch nicht, dass die

301
00:14:21,690 --> 00:14:25,423
‫Anwendung zum Verschlüsseln des Passworts zu lange dauert. OK?

302
00:14:25,423 --> 00:14:27,920
‫Damit haben wir also unser Passwort

303
00:14:27,920 --> 00:14:30,070
‫verschlüsselt und jetzt am Ende

304
00:14:30,070 --> 00:14:33,840
‫müssen wir im Grunde genommen das Bestätigungspasswort löschen, in Ordnung?

305
00:14:33,840 --> 00:14:35,670
‫Denn zu diesem Zeitpunkt

306
00:14:35,670 --> 00:14:38,663
‫haben wir nur das echte Passwort gehasht, oder?

307
00:14:40,560 --> 00:14:42,489
‫Also, diese Punkt-Passwortbestätigung, Also, diese

308
00:14:42,489 --> 00:14:43,643
‫Punkt-Passwortbestätigung, und

309
00:14:43,643 --> 00:14:45,980
‫wie wir das Feld grundsätzlich löschen,

310
00:14:45,980 --> 00:14:48,740
‫damit es nicht in der Datenbank beibehalten

311
00:14:48,740 --> 00:14:51,440
‫wird, ist es auf undefiniert zu setzen.

312
00:14:51,440 --> 00:14:52,400
‫Gut?

313
00:14:52,400 --> 00:14:55,970
‫Wir brauchen diese Passwortbestätigung hier also wirklich nur für

314
00:14:55,970 --> 00:14:58,950
‫die Validierung, die wir zuvor implementiert haben.

315
00:14:58,950 --> 00:15:00,730
‫Also nur um sicherzustellen,

316
00:15:00,730 --> 00:15:03,160
‫dass der Benutzer tatsächlich zwei gleiche Passwörter

317
00:15:03,160 --> 00:15:06,660
‫eingegeben hat, damit er keine Fehler mit seinem Passwort macht.

318
00:15:06,660 --> 00:15:07,590
‫Richtig?

319
00:15:07,590 --> 00:15:10,300
‫Nachdem diese Validierung erfolgreich war, benötigen

320
00:15:10,300 --> 00:15:13,060
‫wir dieses Feld tatsächlich nicht mehr, sodass

321
00:15:13,060 --> 00:15:16,710
‫wir es wirklich nicht in der Datenbank speichern möchten.

322
00:15:16,710 --> 00:15:20,130
‫Und deshalb setzen wir es hier einfach auf undefiniert.

323
00:15:20,130 --> 00:15:21,150
‫Gut?

324
00:15:21,150 --> 00:15:23,220
‫Jetzt fragen Sie sich vielleicht, warum

325
00:15:23,220 --> 00:15:25,920
‫das funktioniert, weil wir die Passwortbestätigung tatsächlich auf

326
00:15:25,920 --> 00:15:27,800
‫erforderlich gesetzt haben, oder?

327
00:15:27,800 --> 00:15:30,750
‫Aber das bedeutet einfach, dass es eine erforderliche Eingabe

328
00:15:30,750 --> 00:15:33,650
‫ist und nicht, dass sie tatsächlich in der Datenbank

329
00:15:33,650 --> 00:15:35,149
‫gespeichert werden muss, okay?

330
00:15:35,149 --> 00:15:36,982
‫zur Datenbank, okay?

331
00:15:38,393 --> 00:15:42,390
‫Zum Abschluss müssen wir natürlich noch als nächstes anrufen.

332
00:15:42,390 --> 00:15:43,240
‫Okay?

333
00:15:43,240 --> 00:15:44,290
‫Lassen Sie es uns sparen.

334
00:15:45,640 --> 00:15:47,440
‫Und eigentlich werde ich hier einige Kommentare

335
00:15:47,440 --> 00:15:49,370
‫hinzufügen, um es für Sie wirklich klar zu machen.

336
00:15:49,370 --> 00:15:52,400
‫Im Grunde wird diese Funktion also nur

337
00:15:54,180 --> 00:15:55,050
‫ausgeführt,

338
00:15:56,160 --> 00:15:57,190
‫wenn das

339
00:15:58,930 --> 00:16:00,533
‫Kennwort tatsächlich geändert wurde.

340
00:16:05,070 --> 00:16:05,903
‫Dann

341
00:16:08,840 --> 00:16:11,803
‫Hash hier das Passwort mit Kosten von 12.

342
00:16:14,785 --> 00:16:16,300
‫Löschen Sie

343
00:16:16,300 --> 00:16:19,443
‫dann das Feld zur Kennwortbestätigung.

344
00:16:20,750 --> 00:16:21,583
‫Okay.

345
00:16:21,583 --> 00:16:24,453
‫Und jetzt lassen Sie uns das testen.

346
00:16:25,660 --> 00:16:29,590
‫Und ich werde jetzt mit genau diesen Daten einen neuen Benutzer anlegen

347
00:16:29,590 --> 00:16:32,470
‫und schauen wir uns nun das Ergebnis an.

348
00:16:32,470 --> 00:16:36,460
‫Und tatsächlich erhalten wir jetzt dieses sehr seltsam aussehende Passwort,

349
00:16:36,460 --> 00:16:40,163
‫das tatsächlich die verschlüsselte Version von pass1234 ist.

350
00:16:41,410 --> 00:16:45,580
‫Und auch, wie Sie sehen, ist die Passwortbestätigung nicht mehr vorhanden.

351
00:16:45,580 --> 00:16:46,413
‫Okay?

352
00:16:46,413 --> 00:16:48,930
‫Und so haben wir jetzt Benutzer auf

353
00:16:48,930 --> 00:16:51,353
‫sichere Weise in unserer Datenbank gespeichert.

354
00:16:52,280 --> 00:16:55,310
‫Lassen Sie mich Ihnen jetzt nur zeigen, wie es funktioniert,

355
00:16:55,310 --> 00:16:58,233
‫wenn wir es hier beispielsweise auf 16 setzen.

356
00:17:00,740 --> 00:17:02,540
‫Und ich muss die E-Mail hier ändern.

357
00:17:03,540 --> 00:17:07,120
‫Und so sollte das jetzt viel Zeit in Anspruch nehmen und ich bin mir

358
00:17:07,120 --> 00:17:09,180
‫nicht sicher, ob ich überhaupt warten kann.

359
00:17:09,180 --> 00:17:12,490
‫Oh, eigentlich hat es viereinhalb Sekunden gedauert.

360
00:17:12,490 --> 00:17:17,320
‫Aber das ist glaube ich immer noch ein bisschen zu viel, okay?

361
00:17:17,320 --> 00:17:18,980
‫Also, setzen wir es

362
00:17:18,980 --> 00:17:20,330
‫zurück auf

363
00:17:21,410 --> 00:17:24,507
‫12 und das sollte besser sein, okay?

364
00:17:24,507 --> 00:17:26,670
‫Und jetzt löschen wir einfach noch

365
00:17:26,670 --> 00:17:29,630
‫einmal diese Benutzer hier, die wir gerade erstellt haben.

366
00:17:29,630 --> 00:17:32,110
‫Und eigentlich muss ich diesen

367
00:17:32,110 --> 00:17:36,000
‫ersten loswerden, weil dieser noch das Passwort im Klartext hat.

368
00:17:36,000 --> 00:17:38,090
‫Dieser Benutzer wird also

369
00:17:38,090 --> 00:17:40,370
‫nicht funktionieren, wenn wir anfangen,

370
00:17:40,370 --> 00:17:42,621
‫Benutzer anhand ihres Passworts anzumelden.

371
00:17:42,621 --> 00:17:44,250
‫Okay?

372
00:17:44,250 --> 00:17:45,743
‫Also lass uns das loswerden.

373
00:17:52,780 --> 00:17:54,060
‫Okay?

374
00:17:54,060 --> 00:17:56,170
‫Und was ich Ihnen hier auch zeigen

375
00:17:57,510 --> 00:17:59,880
‫wollte, ist, dass wir für diese beiden Benutzer

376
00:17:59,880 --> 00:18:02,390
‫genau dasselbe Passwort eingeben, das wir erstellt haben, oder?

377
00:18:02,390 --> 00:18:04,520
‫Aber Sie sehen, dass

378
00:18:04,520 --> 00:18:07,630
‫das verschlüsselte Passwort tatsächlich ganz anders ist, oder?

379
00:18:07,630 --> 00:18:09,820
‫Und das ist die Macht, das Passwort zu salzen,

380
00:18:09,820 --> 00:18:11,043
‫bevor es gehasht wird.

381
00:18:12,220 --> 00:18:13,060
‫Gut?

382
00:18:13,060 --> 00:18:17,250
‫So haben wir auch hier wieder ein sehr sicheres

383
00:18:17,250 --> 00:18:19,313
‫und gutes Passwortmanagement implementiert.

