Rumah  >  Artikel  >  Java  >  Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

WBOY
WBOYke hadapan
2023-05-17 17:31:351322semak imbas

1: Pengenalan Masalah

Nyahsulit kata laluan yang disimpan dalam pangkalan data:

Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

Anda boleh lihat saya terkejut kerana berjaya menyahsulit kata laluan saya, kerana kita semua tahu bahawa algoritma MD5 tidak boleh diterbalikkan kerana ia adalah fungsi cincang dan menggunakan algoritma cincang Semasa proses pengiraan, sebahagian daripada maklumat asal hilang. Jadi mengapa kata laluan saya boleh dinyahsulit di tapak web?

Selepas beberapa carian, saya mendapati bahawa prinsip penyahsulitan alat penyahsulitan dalam talian adalah sangat mudah Prinsipnya adalah untuk mengumpul kata laluan mudah yang biasa digunakan oleh pengguna untuk membentuk kamus kata laluan, dan kemudian menyulitkan kata laluan dalam kamus. dengan MD5 dan simpannya , semasa apa yang dipanggil "penyahsulitan", teks sifir penyulitan kata laluan pengguna sebenar dibandingkan dengan kata laluan yang disimpan. Jika teks sifir wujud dalam kamus, ia boleh "disulitkan". Oleh itu, hanya menggunakan MD5 untuk menyulitkan kata laluan pengguna adalah tidak selamat Apabila kami menetapkan kata laluan, kami biasanya mempunyai pengesanan kerumitan Contohnya, kata laluan mesti mengandungi nombor bahasa Inggeris dan sebagainya, hanya untuk alasan keselamatan.

Selepas mengetahui prinsip penyahsulitan, kami mencuba kata laluan yang lebih kompleks untuk melihat sama ada ia boleh "dinyahsulitkan" Mula-mula, menyulitkan kata laluan "qweasd666":

Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

Selepas penyulitan, kami memilih teks sifir kecil 32-bit untuk penyahsulitan:

Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java

Kegagalan untuk menyahsulit menunjukkan bahawa prinsipnya adalah untuk mengumpul teks sifir yang biasa digunakan untuk pemadanan dan retak. Memandangkan kata laluan "qweasd666" tidak boleh dipecahkan, ia sepatutnya selamat dan anda semua boleh menggunakan kata laluan ini (doge).

Berbalik kepada subjek, tapak web ini berjaya memecahkan kata laluan saya yang telah ditetapkan dengan teliti, yang membuatkan saya berasa sangat tidak selamat dan saya berasa kehilangan muka saya.

Selain daripada operasi penyahsulitan yang dinyatakan di atas, terdapat satu lagi masalah besar Apabila bahagian hadapan menghantar data, http menggunakan penghantaran teks biasa Jika paket data penghantaran dipintas, maka bahagian belakang anda Tidak kira betapa rumitnya algoritma penyulitan, kata laluan anda akan diketahui oleh orang lain.

Dua: Penyelesaian

2.1: Penyulitan Pertama

Selepas menemui masalah, kami boleh menetapkan ubat yang betul Pertama sekali, saya fikir masalah itu perlu diselesaikan adalah masalah penghantaran http plaintext , kerana ini adalah risiko tertinggi yang boleh ditangkap oleh penangkapan paket biasa. Memandangkan terdapat isu keselamatan dengan penghantaran teks biasa, kami boleh memastikan keselamatan penghantaran melalui penyulitan

Saya masih menggunakan skim penyulitan MD5, tetapi menambah nilai garam tetap sebelum menyulitkan kata laluan. garam? Adakah ia menambah garam? Sebenarnya, ia adalah lebih baik untuk mengatakan ia menambah beberapa "perasa". Idea asasnya ialah: apabila pengguna memberikan kata laluan untuk kali pertama (biasanya semasa mendaftar), program ini menaburkan beberapa "sos" ke dalam kata laluan Untuk mengurangkan tekanan pembangunan, perasa ini adalah sama untuk setiap pengguna hash lagi. Ini akan menghalang kebocoran kata laluan teks yang jelas semasa penghantaran.

2.2: Penyulitan kedua

Perhatikan bahawa apa yang saya nyatakan di atas adalah untuk mengelakkan kebocoran kata laluan teks biasa, tetapi ini tidak bermakna teks sifir tidak akan bocor Jika penggodam memintas kata laluan anda menghantar melalui http Kata laluan yang disulitkan, atau kebocoran pangkalan data menyebabkan kata laluan yang disulitkan dicuri oleh penggodam pertanyaan terbalik melalui jadual pelangi untuk mendapatkan kata laluan asal. Pada masa ini, kepentingan penyulitan sekunder keluar Prinsip penyulitan sekunder adalah untuk menggabungkan kata laluan yang disulitkan dari bahagian hadapan dengan nilai Garam rawak dan kemudian menyulitkannya (perhatikan bahawa kali ini adalah nilai garam). akan Ia dijana secara rawak apabila pengguna log masuk dan disimpan dalam pangkalan data.

Pada masa ini, anda mungkin mempunyai keraguan yang sama seperti saya pada mulanya, iaitu, anda telah menyimpan nilai garam rawak dalam pangkalan data, jadi jika pangkalan data bocor, apakah nilai garam rawak anda akan lakukan? Tidakkah mungkin bagi penggodam untuk mendapatkan kata laluan dengan menyahsulit data yang disulitkan dan mengeluarkan nilai garam? Ya, adalah mungkin bagi penggodam untuk mendapatkan kata laluan melalui cara sedemikian, tetapi hanya jika dia boleh menyahsulitnya Apa yang anda perlu tahu ialah MD5 tidak boleh dipecahkan secara langsung dan hanya boleh dinyahsulit melalui kaedah yang lengkap. Walaupun penggodam memperoleh kata laluan yang disulitkan dalam pangkalan data, tetapi tidak mengetahui proses penyulitan bahagian belakang, dia tidak akan dapat menghuraikannya Walaupun penggodam mengetahui proses penyulitan pada masa yang sama, disebabkan oleh pengasinan sekunder dan penyulitan sekunder, teks sifir pada masa ini sukar untuk dihuraikan Memandangkan kerumitan data yang disulitkan meningkat, kos pemecahan meningkat secara eksponen Dalam menghadapi kos yang begitu besar, saya percaya tiada penggodam yang sanggup cubalah. Sudah tentu, garam tidak perlu ditambah di hadapan atau di hujung Ia juga boleh dimasukkan di tengah, secara berasingan, atau dalam susunan terbalik Ia boleh dilaraskan secara fleksibel semasa reka bentuk program, yang boleh meningkatkan kesukaran secara eksponen retak.

2.3: Pelaksanaan khusus

2.3.1: Pendaftaran pengguna

  • Hujung hadapan melakukan penyulitan md5 pada kata laluan yang dimasukkan oleh pengguna (garam tetap )

  • Hantar kata laluan yang disulitkan ke bahagian belakang

  • Halaman belakang secara rawak menjana garam

  • Gunakan Generate salt untuk menyulitkan kata laluan yang diluluskan dari bahagian hadapan, dan kemudian simpan kata laluan yang disulitkan dan garam bersama-sama dalam db

2.3.2: Log masuk pengguna

  • Halaman hadapan melakukan penyulitan md5 pada kata laluan yang dimasukkan oleh pengguna (garam tetap)

  • Lepaskan kata laluan yang disulitkan ke bahagian belakang

  • Bahagian belakang menggunakan akaun pengguna untuk mendapatkan semula maklumat pengguna

  • Bahagian belakang melakukan penyulitan md5 pada kata laluan yang disulitkan (mengeluarkan garam), dan kemudian membandingkannya dengan kata laluan disimpan dalam pangkalan data

  • Jika sepadan, log masuk berjaya, jika tidak log masuk gagal

3: Pelaksanaan kod

3.1: Penyulitan pertama

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 || '操作失败')
    }
}

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: Second encryption

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
}

3.2. 2: Bahagian belakang

rreee

Atas ialah kandungan terperinci Bagaimana untuk mencapai log masuk selamat dengan penyulitan MD5 berganda Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam