[login] > 后端加密 前端解密可以用 前端加密后端解密忘了 ### rust ##### lib.rs ``` use wasm_bindgen::prelude::*; use base64; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use web_sys::js_sys; #[wasm_bindgen] pub fn say(s: &str) -> String { if !init() { return String::from(""); } let decrypted_string = decrypt_string(&s); let decrypted_string = decrypt_string2(&decrypted_string); let decrypted_chinese_string = decrypt_chinese_string(&decrypted_string); decrypted_chinese_string } #[wasm_bindgen] pub fn ask(s: &str) -> String { if !init() { return String::from(""); } let encrypted_string = encrypt_chinese_string(&s); let encrypted_string = encrypt_string2(&encrypted_string); let encrypted_string = encrypt_string(&encrypted_string); encrypted_string } #[wasm_bindgen] pub fn ATTK() -> String { if !init() { return String::from(""); } //获取时间戳 let timestamp = js_sys::Date::now(); //转换成字符串 let timestamp = timestamp.to_string(); let encrypted_string = encrypt_chinese_string(×tamp); let encrypted_string = encrypt_string2(&encrypted_string); let encrypted_string = encrypt_string(&encrypted_string); encrypted_string } fn init() -> bool { let window = web_sys::window().expect(""); let location = window.location(); let hostname = location.hostname().expect(""); // if hostname != "192.168.1.18" && hostname != "127.0.0.1" && hostname != "localhost"{ // return false; // } //如果hostname不是yanpinshi.com 或者new.yanpinshi.com 就返回空 if hostname != "yanpinshi.com" && hostname != "new.yanpinshi.com" && hostname != "www.yanpinshi.com" && hostname != "pdd.doubao.vip"{ return false; } //判断时间大于2024-1-30,就返回空 if !is_past_time(2024, 3, 30) { return false; } return true; } fn is_past_time(year: i32, month: u32, day: u32) -> bool { let mynow = js_sys::Date::new_0(); let myyear = mynow.get_full_year() as i32; // 使用 as 进行类型转换 let mymonth = mynow.get_month() + 1; // 月份从 0 开始,需要加 1 let myday = mynow.get_date(); if myyear > year || (myyear == year && (mymonth > month || (mymonth == month && myday > day))) { return false; } return true; } fn decrypt_string(input: &str) -> String { // 去掉每隔6个字符的字符 let mut de = String::new(); for (i, c) in input.chars().enumerate() { if (i + 1) % 7 != 0 { de.push(c); } } // 去掉前面的24个字符 let result = &de[24..]; result.to_string() } fn decrypt_string2(input: &str) -> String { // 去掉每隔6个字符的字符 let mut de = String::new(); for (i, c) in input.chars().enumerate() { if (i + 1) % 9 != 0 { de.push(c); } } // 去掉前面的24个字符 let result = &de[23..]; result.to_string() } // 解密中文字符串 fn decrypt_chinese_string(input: &str) -> String { let base64_decoded = match base64::decode(input) { Ok(decoded) => decoded, Err(_) => return String::from("decoding error"), }; let decrypted: String = String::from_utf8_lossy(&base64_decoded).into_owned(); decrypted } //加密中文字符串 fn encrypt_chinese_string(input: &str) -> String { let base64_encoded = base64::encode(input); base64_encoded } fn encrypt_string(input: &str) -> String { // input前面随机加上23个字符 let mut random_string = generate_random_string(24); random_string.push_str(input); //每隔8个字符加上一个字符 let mut en = String::new(); for (i, c) in random_string.chars().enumerate() { en.push(c); if (i + 1) % 6 == 0 { en.push(generate_random_string(1).chars().next().unwrap()); } } en } fn encrypt_string2(input: &str) -> String { // input前面随机加上23个字符 let mut random_string = generate_random_string(23); random_string.push_str(input); //每隔8个字符加上一个字符 let mut en = String::new(); for (i, c) in random_string.chars().enumerate() { en.push(c); if (i + 1) % 8 == 0 { en.push(generate_random_string(1).chars().next().unwrap()); } } en } // 生成随机字符串 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+" fn generate_random_string(length: usize) -> String { let mut rng = thread_rng(); let random_string: String = rng .sample_iter(&Alphanumeric) .take(length) .map(char::from) .collect(); random_string } // wasm-pack build --target web ``` ##### Cargo.toml ``` [package] name = "yanpinshi" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2.83" rand = "0.8.5" getrandom = { version = "0.2.11", features = ["js"] } base64 = "0.13.0" [dependencies.web-sys] version = "0.3.66" features = [ "Window", "Document", "Element", "Location" ] ``` ### java ``` package com.ruoyi.system.utils; import com.alibaba.fastjson2.JSON; import java.security.SecureRandom; import java.util.Base64; public class WASMEnDe { public static void main(String[] args) { String input = "你好,世界!"; // 要加密的中文字符串 String encryptedString = WASMEnDe.encryptChineseString(input); System.out.println("加密后的字符串: " + encryptedString); //循环加密2次 String doubleEncryptedString = encryptedString; doubleEncryptedString = WASMEnDe.encryptString2(doubleEncryptedString); doubleEncryptedString = WASMEnDe.encryptString(doubleEncryptedString); System.out.println("双重加密后的字符串: " + doubleEncryptedString); // doubleEncryptedString="KKIOBTVK1BV9PzvgZGXXItJOKaEBh7bz1egfcQaoyrnEMUs2vAKUTgv7NMUTcwzMzY1OdBTUwMjUowMzA==0"; String decryptedString = decryptString(doubleEncryptedString); decryptedString= decryptString2(decryptedString); System.out.println("双重解密后的字符串: " + decryptedString); String decryptedChineseString = decryptChineseString(decryptedString); System.out.println("解密后的中文字符串: " + decryptedChineseString); if (decryptedChineseString.equals(input)) { System.out.println("加密解密成功: " + decryptedChineseString); } else { System.out.println("加密解密失败"); } } public static String getEn(String input) { String encryptedString = WASMEnDe.encryptChineseString(input); String doubleEncryptedString = encryptedString; doubleEncryptedString = WASMEnDe.encryptString2(doubleEncryptedString); doubleEncryptedString = WASMEnDe.encryptString(doubleEncryptedString); System.out.println("双重加密后的字符串: " + doubleEncryptedString); return doubleEncryptedString; } public static String getDe(String input) { String decryptedString = decryptString(input); decryptedString= decryptString2(decryptedString); String decryptedChineseString = decryptChineseString(decryptedString); System.out.println("解密后的中文字符串: " + decryptedChineseString); return decryptedChineseString; } // public static String encryptChineseString(String input) { return Base64.getEncoder().encodeToString(input.getBytes()); } // public static String encryptString(String input) { // 前面随机加上24个字符 String en= generateRandomString(24)+input; //然后每隔6个字符加上一个字符 StringBuilder sb = new StringBuilder(en); for (int i = 6; i < sb.length(); i += 7) { sb.insert(i, generateRandomString(1)); } return sb.toString(); } public static String encryptString2(String input) { // 前面随机加上23个字符 String en= generateRandomString(23)+input; // 每隔8个字符加上一个字符 StringBuilder sb = new StringBuilder(en); for (int i = 8; i < sb.length(); i += 9) { sb.insert(i, generateRandomString(1)); } return sb.toString(); } // 对字符串进行解密 public static String decryptString(String input) { // 去掉每隔6个字符的字符 StringBuilder de = new StringBuilder(); for (int i = 0; i < input.length(); i++) { if ((i + 1) % 7 != 0) { de.append(input.charAt(i)); } } // 去掉前面的24个字符 String result = de.substring(24); return result; } public static String decryptString2(String input) { // 去掉每隔6个字符的字符 StringBuilder de = new StringBuilder(); for (int i = 0; i < input.length(); i++) { if ((i + 1) % 9 != 0) { de.append(input.charAt(i)); } } // 去掉前面的24个字符 String result = de.substring(23); return result; } // public static String decryptChineseString(String input) { byte[] base64Decoded = Base64.getDecoder().decode(input); return new String(base64Decoded); } private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; private static SecureRandom random = new SecureRandom(); public static String generateRandomString(int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++) { sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length()))); } return sb.toString(); } } ``` 调用 ` WASMEnDe.getEn(JSON.toJSONString(data)); ` ### HTML测试页 ``` Wasm - Say hello What is your name? Click the button attk en de ``` [/login] 该部分仅登录用户可见 最后修改:2024 年 02 月 28 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏