js实现数据加密,jwt加密方式

发布于:2024-06-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

一个简单的数据加密

const crypto = require("crypto");

// 普通的数据加密
function sign(msg,key){ // 原始信息,密钥 String
    // "sha256" :加密的算法,key :密钥,msg :要加密的信息,"hex" :转成16进制字符串
    return crypto.createHmac("sha256",key).update(msg).digest("hex");
}
console.log(sign("123","aaa"));

通过crypto包的加密方法,以及设置密钥和对应的算法,可以将简单的数据进行加密得到一个字符串:

“a35c465aac6252eb6de876fccd8769b2d1f0310cf51452f927247125a9576b24”

这个字符串是不可逆的,要验证数据,只能将数据和原来的密钥还有算法,重新加密对比,

但是加密数据通常在后端进行,这种直接加密的方式,需要拿到原本的数据进行加密比对,而原本真实的数据频繁进入网络传输会增加被拦截的风险,容易泄露个人隐私信息,

jwt 加密

        JSON Web Token (JWT) ,一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于将信息作为 JSON 对象在各方之间安全地传输。此信息可以验证和信任,因为它是数字签名的。可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对 JWT 进行签名。

简单来说就是,一串由公钥或私钥加密的,有时间戳的,有结构的,可解码的json字符串 ,

        当加密的数据(token)生成后,一般会返回给客户端保存,每次客户端发起请求时,都会在头部携带上这个数据,后端收到数据后,会优先验证这个数据的有效性(有无被修改,或者时间过期)再决定是否返回数据,这样就完成了一次身份验证,而这种方式,大部分时间传输的都是token数据,在没有密钥的情况下很难从中破译出有用的信息

jwt的结构

// 数据头 加密算法,加密模式 

header :{"alg":"sha256","type":"jwt"},

// 数据主体

payload :{"username":"Tom","password":123}

// 加密后的数据码

signature: 

// 加密后的数据格式(用2个'.'隔开)

xxxxx.yyyyy.zzzzz

jwt的加密流程:数据json化进行密钥和指定算法加密,得到base64编码化的字符串

jwt加密的模拟示例

// jwt模式 json web token : 数据json化进行密钥和指定算法加密,得到base64编码化的字符串
// 初始数据
let data = {
    // 数据头 加密算法,加密模式
    header:{"alg":"sha256","type":"jwt"},
    // 数据主体 真实数据中一般还有时间戳
    payload:{"username":"Tom","password":123}
}
// base64字符转换 btoa() atob(),编码方式非加密,可相互转换
console.log(btoa(JSON.stringify(data)));
console.log(atob(btoa(JSON.stringify(data))));

// 原始数据集,密钥
function jwt(data,key){
    // 数据头base64转换
    let header = btoa(JSON.stringify(data.header));
    // 数据主体base64转换
    let payload = btoa(JSON.stringify(data.payload));
    // 获得加密的数据
    let hash = crypto.createHmac(data.header.alg,key).update(header+"."+payload).digest("hex");
    // 加密的数据base64转换
    let signature = btoa(hash);
    return  header+"."+payload+"."+signature;
}
let msg = jwt(data,"aaa");
console.log(msg);

// 完整数据
let endData ={
    // 数据头 加密算法,加密模式
    header : data.header,
    // 数据主体 
    payload : data.payload,
    // 加密后的数据码
    msg : msg
}
console.log(endData);

// 验证完整数据
function isTrue(endData){
// 在完整数据中,通过‘aaa’密钥和数据中指定的加密算法、模式,生成加密数据,对比msg中的数据
    if( jwt(endData,"aaa") === endData.msg){
        return true;
    }else{
        return false;
    }
}

console.log(isTrue(endData));


网站公告

今日签到

点亮在社区的每一天
去签到