javaSHA算法加密 urlencode layuimini使用json传值

本文介绍如何在Java中使用Apache Commons Codec库的SHA算法进行密码加密,以及一个基于角色的权限系统实现,该系统能根据用户角色动态生成菜单结构。

java SHA算法使用common包

org.apache.commons.codec.digest.DigestUtils

public static String encodePassword(String psw) {
    if(StringUtils.isEmpty(psw)){
        return null;
    }else{
        return DigestUtils.sha1Hex(psw);
    }
} 

try {
            String encode = URLEncoder.encode("123", "unicode").toUpperCase();
            return DigestUtils.sha1Hex(encode);
        } catch (UnsupportedEncodingException e) {
            log.error(e.getMessage());
        }
        return null;

layuimini的json生成

后台使用简单的用户权限系统


package com.foxconn.iqc3dmmt.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.foxconn.iqc3dmmt.service.RoleService;
@Controller
public class RoleController {

    @Autowired
    RoleService roleService;
    /**
     * @description 根據角色獲取菜單
     * @return 返回對應角色的菜單的json串
     */
    @GetMapping("/getMenu")
    @ResponseBody
    public Map<String,Object> getMenuByJson(HttpServletRequest request){
        @SuppressWarnings("unchecked")
        Map<String,Object> user = (Map<String,Object>)request.getSession().getAttribute("user");
        String id = user.get("ID")+"";
      //數據庫回傳數據
        List<Map<String,Object>> list = roleService.getMenu(id);
//        Map<String,Object> test1 = new HashMap<>();
//        test1.put("PARENT_MENU_ID", "0");
//        test1.put("title", "任務總管");
//        test1.put("href", "page/task.html");
//        test1.put("icon", "#");
//        test1.put("ID", "1");
//        Map<String,Object> test2 = new HashMap<>();
//        test2.put("PARENT_MENU_ID", "1");
//        test2.put("title", "任務總管1");
//        test2.put("href", "page/task.html");
//        test2.put("icon", "#");
//        test2.put("ID", "2");
//        Map<String,Object> test3 = new HashMap<>();
//        test3.put("PARENT_MENU_ID", "2");
//        test3.put("title", "任務總管2");
//        test3.put("href", "page/task.html");
//        test3.put("icon", "#");
//        test3.put("ID", "3");
//        list.add(test1);
//        list.add(test2);
//        list.add(test3);
        
        //回傳的Map
        Map<String,Object> returnMap = new HashMap<>();
        //回傳Map的一級菜單
        Map<String,Object> menuInfo = new HashMap<>();
        //回傳Map的二級菜單
        Map<String,Object> currency = new HashMap<>();
        //排序菜單(除了ID相關的內容,用AS變為別名)
        for (int i = 0;i < list.size();i++) {
            //獲取父ID不是0的菜單(子菜單)
            int parentId = Integer.parseInt(list.get(i).get("PARENT_MENU_ID")+"");
            if(parentId != 0) {
                //創建新的子菜單的List
                List<Map<String,Object>> childList = new ArrayList<Map<String,Object>>();
                for (int j = 0;j < list.size();j++) {
                    if(Integer.parseInt(list.get(j).get("ID")+"") == parentId) {
                        //如果是第一次則創建子菜單的List
                        if(list.get(j).get("child") == null) {
                            list.get(j).put("child", childList);
                        }
                        //將子菜單放入父菜單中
                        @SuppressWarnings("unchecked")
                        List<Map<String,Object>> cList = (List<Map<String,Object>>)list.get(j).get("child");
                        cList.add(list.get(i));
                    }
                    //菜單放進去前要整理格式(去掉ID相關內容)
                }
            }
        }
        System.out.println(list);
        //刪除多餘子菜單
        for (int i = 0;i < list.size();i++) {
            int parentId = Integer.parseInt(list.get(i).get("PARENT_MENU_ID")+"");
            if(parentId != 0) {
                list.remove(i);
                i--;
            }
        }
        currency.put("child", list);
        menuInfo.put("currency",currency);
        returnMap.put("menuInfo",menuInfo);
        return returnMap;
    }
}

<think>好的,我需要回答用户关于JWS和JWE的区别及用法的问题。首先,我得回忆一下JWS和JWE的基本概念。JWS主要是用于签名,确保数据的完整性和来源验证,而JWE用于加密,保护数据的机密性。用户可能想知道它们各自的应用场景,以及如何选择使用哪一个。根据提供的引用,引用[1]提到JWS带有签名部分,而JWE加密payload。引用[4]区分了JWT的结构,其中JWS处理签名,JWE处理加密。需要指出两者的核心功能差异:签名vs加密,以及对应的安全目标。 接下来,使用场景方面,用户可能需要知道什么时候该用签名,比如API认证,什么时候需要加密,比如输敏感信息。引用[2]和[3]提到JWS的序列化形式和结构,可以举例说明JWS的应用,如JWT令牌。而JWE适用于需要保密的情况,如加密数据。结构差异部分,引用[1]和[3]描述了JWS的结构含签名,而JWE的结构加密的密文。需要详细说明两者的组成部分,比如JWS的header、payload、signature,而JWE的header、加密密钥、初始化向量、密文和认证标签等。 最后,结合用户的问题,可能需要生成相关问题,比如如何生成密钥,如何选择算法,或者实际应用中的最佳实践。需要确保问题覆盖用户可能感兴趣的扩展内容。 现在需要组织这些信息,用中文清晰回答,并正确引用来源。同时检查LaTeX格式是否符合要求,行内公式用$...$,独立公式用$$...$$。确保没有使用markdown,段落分隔自然。</think>### JSON Web 签名(JWS)与JSON Web 加密(JWE)的区别和用法 #### 1. **核心功能差异** - **JWS(JSON Web Signature)** 用于生成数字签名,确保数据完整性和来源验证。通过签名部分(`signature`)验证内容是否被篡改[^1]。例如,JWT(JSON Web Token)默认使用JWS实现认证令牌,确保声明的可信性[^4]。 结构示例:`Header.Payload.Signature`,其中`Payload`是明文数据[^1][^3]。 - **JWE(JSON Web Encryption)** 用于加密数据,确保数据机密性。将`Payload`转换为密文,防止未授权方读取[^1][^4]。例如,输敏感信息(如用户隐私数据)时使用。 结构示例:`Header.EncryptedKey.IV.Ciphertext.AuthenticationTag`,加密算法、密钥和初始化向量等[^1]。 #### 2. **使用场景对比** | **场景** | **JWS适用性** | **JWE适用性** | |------------------------|---------------------------------------|---------------------------------------| | API身份认证 | ✅ 生成带有签名的令牌(如JWT)[^4] | ❌ 无需加密 | | 输敏感数据(如密码) | ❌ 仅签名无法隐藏数据 | ✅ 加密确保数据保密 | | 数据防篡改验证 | ✅ 签名验证完整性[^1] | ❌ 加密不直接验证完整性 | #### 3. **技术实现差异** - **JWS签名流程** 1. 生成头部(`Header`),声明算法(如`HS256`)[^3]。 2. 对`Header`和`Payload`进行Base64Url编码。 3. 使用密钥对拼接后的字符串计算签名[^2]。 代码示例(伪代码): ```python signature = HMAC-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) ``` - **JWE加密流程** 1. 生成加密密钥(可能通过密钥协商协议)。 2. 使用对称算法(如`AES-GCM`)加密`Payload`。 3. 封装加密后的数据及元信息(如IV)[^1]。 #### 4. **如何选择?** - **需要验证数据来源或完整性** → 选择JWS。 - **需要保护数据隐私** → 选择JWE。 - **两者兼顾** → 可组合使用(如先加密再签名,或先签名再加密)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值