


So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung
Eins: Problemeinführung
Entschlüsseln Sie das in der Datenbank gespeicherte Passwort:
Sie können sehen, dass mein Passwort erfolgreich entschlüsselt wurde, was mich überrascht hat, denn wir alle wissen, dass der MD5-Algorithmus irreversibel ist, weil Es ist eine Hash-Funktion und verwendet den Hash-Algorithmus. Während des Berechnungsprozesses geht ein Teil der ursprünglichen Informationen verloren. Warum kann mein Passwort auf der Website entschlüsselt werden?
Nach einigem Suchen habe ich festgestellt, dass das Entschlüsselungsprinzip des Online-Entschlüsselungstools sehr einfach ist. Das Prinzip besteht darin, die von Benutzern üblicherweise verwendeten einfachen Passwörter zu sammeln, um ein Passwortwörterbuch zu erstellen, und die Passwörter im Wörterbuch dann mit MD5 zu verschlüsseln Speichern Sie sie im sogenannten „Entschlüsseln“ und vergleichen Sie den Chiffretext der echten Benutzerkennwortverschlüsselung mit dem gespeicherten Passwort. Wenn der Chiffretext im Wörterbuch vorhanden ist, kann er „entschlüsselt“ werden. Daher ist die einfache Verwendung von MD5 zum Verschlüsseln von Benutzerkennwörtern nicht sicher. Wenn wir Kennwörter festlegen, muss das Kennwort beispielsweise aus Sicherheitsgründen englische Zahlen enthalten.
Nachdem wir das Entschlüsselungsprinzip kennengelernt haben, probieren wir ein komplexeres Passwort aus, um zu sehen, ob es „entschlüsselt“ werden kann. Verschlüsseln Sie zunächst das Passwort „qweasd666“:
Nach der Verschlüsselung wählen wir den 32-stelligen Kleinbuchstaben-Chiffretext für aus Entschlüsselung. Vorgang:
Ein Entschlüsselungsfehler zeigt an, dass das Prinzip darin besteht, häufig verwendete Chiffretexte abzugleichen und zu knacken. Da das Passwort „qweasd666“ nicht geknackt werden kann, sollte es sicher sein und Sie alle können dieses Passwort verwenden (Doge).
Um auf das Thema zurückzukommen: Diese Website hat mein sorgfältig festgelegtes Passwort erfolgreich geknackt, wodurch ich mich sehr unsicher fühlte und das Gefühl hatte, dass ich mein Login-Sicherheitsniveau verbessern musste.
Zusätzlich zu den oben erwähnten Entschlüsselungsvorgängen besteht ein weiteres großes Problem darin, dass HTTP beim Übertragen der Daten eine Klartextübertragung verwendet. Wenn das übertragene Datenpaket abgefangen wird, spielt es keine Rolle, wie viele Verschlüsselungsalgorithmen Ihr Back-End verwendet Wenn Ihr Passwort komplex ist, wird es anderen bekannt sein. Zwei: Lösung Packet Capture kann es erfassen. Ist es nicht beängstigend, an das Passwort zu kommen? Da es bei der Klartextübertragung Sicherheitsprobleme gibt, können wir die Übertragungssicherheit durch Verschlüsselung gewährleisten.
Ich verwende weiterhin das MD5-Verschlüsselungsschema, füge jedoch vor der Verschlüsselung des Passworts einen festen Salt-Wert hinzu. Salz? Ist es das Hinzufügen von Salz? Tatsächlich ist es fast dasselbe. Es ist besser zu sagen, dass es einige „Gewürze“ hinzufügt. Die Grundidee ist folgende: Wenn der Benutzer zum ersten Mal ein Passwort eingibt (normalerweise bei der Registrierung), streut das Programm etwas „Sauce“ in das Passwort, um den Entwicklungsdruck zu verringern nochmal haschen. Dadurch wird verhindert, dass während der Übertragung Klartext-Passwörter verloren gehen.
2.2: Zweite Verschlüsselung
Beachten Sie, dass das, was ich oben erwähnt habe, darin besteht, den Verlust von Klartext-Passwörtern zu verhindern. Dies bedeutet jedoch nicht, dass der Chiffretext nicht durchgesickert ist, wenn ein Hacker Ihr verschlüsseltes Passwort abfängt, das über http oder die Datenbank übertragen wird Es kommt zu einem Leck und das verschlüsselte Passwort wird von einem Hacker gestohlen, indem er die Front-End-JS-Datei analysiert. Dann kann der Hacker möglicherweise eine umgekehrte Abfrage über die Rainbow-Tabelle durchführen, um den zu erhalten Originalpasswort. Zu diesem Zeitpunkt wird die Bedeutung der sekundären Verschlüsselung deutlich. Das Prinzip der sekundären Verschlüsselung besteht darin, das vom Frontend übergebene verschlüsselte Passwort mit einem zufälligen Salt-Wert zu kombinieren und es dann zu verschlüsseln (beachten Sie, dass es diesmal zufällig ist). Wird Es wird zufällig generiert, wenn sich der Benutzer anmeldet, und in der Datenbank gespeichert.
Zu diesem Zeitpunkt haben Sie möglicherweise die gleichen Zweifel wie ich am Anfang, das heißt, Sie haben den zufälligen Salzwert in der Datenbank gespeichert. Wenn also die Datenbank leckt, was wird Ihr zufälliger Salzwert tun? Wäre es für einen Hacker nicht möglich, an das Passwort zu gelangen, indem er die verschlüsselten Daten entschlüsselt und den Salt-Wert entfernt? Ja, es ist für einen Hacker möglich, auf diese Weise an das Passwort zu gelangen, aber nur, wenn er es entschlüsseln kann. Sie müssen wissen, dass MD5 nicht direkt geknackt werden kann, sondern nur mit der erschöpfenden Methode. Selbst wenn ein Hacker das verschlüsselte Passwort in der Datenbank erhält, aber den Back-End-Verschlüsselungsprozess nicht kennt, kann er es aufgrund des sekundären Salting nicht analysieren. Selbst wenn der Hacker gleichzeitig den Verschlüsselungsprozess kennt und sekundäre Verschlüsselung, der Chiffretext ist derzeit schwer zu analysieren. Da die Komplexität verschlüsselter Daten zunimmt, steigen die Kosten für das Knacken exponentiell. Ich glaube, dass kein Hacker dazu bereit ist Probieren Sie es aus. Natürlich muss Salz nicht vorne oder am Ende hinzugefügt werden. Es kann auch in der Mitte, separat oder in umgekehrter Reihenfolge hinzugefügt werden. Es kann während der Programmgestaltung flexibel angepasst werden, was den Schwierigkeitsgrad exponentiell erhöhen kann knacken. 2.3: Spezifische Implementierung
Das Ende generiert zufällig einen Salt
- Verwenden Sie den generierten Salt, um das vom Frontend übergebene Passwort zu verschlüsseln, und speichern Sie dann das verschlüsselte Passwort und den Salt zusammen in der Datenbank
- 2.3.2: Benutzeranmeldung
- Das verschlüsselte Passwort wird an das Backend übergeben
- Das Backend verwendet das Benutzerkonto, um die Benutzerinformationen abzurufen
- Das Backend Führt md5 für das verschlüsselte Passwort aus. Verschlüsseln (Salt herausnehmen) und dann mit dem in der Datenbank gespeicherten Passwort vergleichen
- Wenn die Übereinstimmung übereinstimmt, ist die Anmeldung erfolgreich, andernfalls schlägt die Anmeldung fehl
- Drei: Code Implementierung
3.1: Erste Verschlüsselung
3.1.1: Frontend const params = { ...this.ruleForm, sex: this.ruleForm.sex === '女' ? '0' : '1', //设置密码加密(加上固定salt值) password: md5(this.ruleForm.password + this.salt) } addEmployee(params).then(res => { if (res.code === 1) { this.$message.success('员工添加成功!') if (!st) { this.goBack() } else { this.ruleForm = { username: '', 'name': '', 'phone': '', password: '', // 'rePassword': '',/ 'sex': '男', 'idNumber': '' } } } else { this.$message.error(res.msg || '操作失败') } }
Nach dem Login kopieren3.1.2: Backend
/** * 添加员工 */ @PostMapping public R<String> save(@RequestBody Employee employee){ //生成随机salt值 String salt = RandomStringUtils.randomAlphanumeric(5); //设置随机盐值 employee.setSalt(salt); //设置密码二次加密 employee.setPassword(DigestUtils.md5DigestAsHex((salt + employee.getPassword()).getBytes())); boolean save = employeeService.save(employee); if(save){ return R.success("添加成功!"); } return R.error("添加失败!"); }
Nach dem Login kopieren3.2: Zweite Verschlüsselung 3.2.1: Frontend
const params = { ...this.loginForm, //登录密码加上固定盐值后发送 password: md5(this.loginForm.password + this.salt), } let res = await loginApi(params) if (String(res.code) === '1') { localStorage.setItem('userInfo', JSON.stringify(res.data)) window.location.href = '/backend/index.html' } else { this.$message.error(res.msg) this.loading = false }
Nach dem Login kopieren3.2.2: Backend
/** * 员工登录 */ @PostMapping("/login") public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){ //1.获取传输过来的加密后的密码值 String encryPassword = employee.getPassword(); //2.从数据库中获取用户信息 LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>(); lqw.eq(Employee::getUsername,employee.getUsername()); Employee emp = employeeService.getOne(lqw); //3.如果没有查询到则返回登陆失败查询结果 if(emp == null){ return R.error("没有查询到该用户信息!"); } //4.获取注册时保存的随机盐值 String salt = emp.getSalt(); //5.将页面提交的密码password进行md5二次加密 String password = DigestUtils.md5DigestAsHex((salt + encryPassword).getBytes()); //6.密码比对,如果不一致则返回登陆失败结果 if(!emp.getPassword().equals(password)){ return R.error("密码错误!"); } //7.查看员工状态是否可用 if(emp.getStatus() == 0){ return R.error("该员工已被禁用!"); } //8.登录成功,将员工id存入Session对象并返回登录成功结果 request.getSession().setAttribute("employee",emp.getId()); return R.success(emp); }
Das obige ist der detaillierte Inhalt vonSo erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
