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.
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
3.1: Erste Verschlüsselung
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 || '操作失败') } }
3.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("添加失败!"); }
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 }
/** * 员工登录 */ @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!