Heim > Java > javaLernprogramm > Hauptteil

So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung

WBOY
Freigeben: 2023-05-17 17:31:35
nach vorne
1328 Leute haben es durchsucht

Eins: Problemeinführung

Entschlüsseln Sie das in der Datenbank gespeicherte Passwort:

So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung

So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung

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“:

So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung

Nach der Verschlüsselung wählen wir den 32-stelligen Kleinbuchstaben-Chiffretext für aus Entschlüsselung. Vorgang:

So erreichen Sie eine sichere Anmeldung mit Java-Doppel-MD5-Verschlüsselung

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
  • Frontend an den Benutzer Das eingegebene Passwort ist MD5-verschlüsselt (Fixed Salt)
  • 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 kopieren

    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("添加失败!");
    }
    Nach dem Login kopieren
  • 3.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) === &#39;1&#39;) {
        localStorage.setItem(&#39;userInfo&#39;, JSON.stringify(res.data))
        window.location.href = &#39;/backend/index.html&#39;
    } else {
        this.$message.error(res.msg)
        this.loading = false
    }
    Nach dem Login kopieren
  • 3.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);
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage