前后端分离,请求加密思路

本文介绍了一种使用时间戳、自定义密码数组和base64加密实现的简单前后端交互安全策略。前端在请求中添加自定义Header,通过加密时间戳和密码数组生成加密字符串,后端接收到请求后解密验证,确保请求的安全性和时效性。这种方法适用于限制特定地址访问,防止数据被轻易解密。
摘要由CSDN通过智能技术生成

1.声明,Access-Control-Allow-Origin 可以指定某个地址访问,可以保证安全

2.多个地址想要访问一个后台地址,似乎有点难,尝试了写正则,不过不太好

3.用的koa2写的后台, vue3前台,本来想着 用crytojs来加密解密,但是感觉有点太杀鸡用牛刀的感觉,个人不喜欢 import各种包,能自己实现的就尽可能自己实现

4.直到我发现了window.btoa,一番折腾,找到了还算可行的加密方法

下面贴给大家

前端代码,写在axios里面的,

主要是添加了一个自定义Header,添加了生成加密字符串的方法

const instance = axios.create({
    baseURL: config.baseUrl,
    timeout: 3000,
    headers: {
        'Xpofz': genPassword()
    }
})

function genPassword() {
    const time = new Date().getTime().toString()
    const list = ["s5lp", 
"pOt#", "#239", "9_*1",
 "1?/n", "nz9I", "IioV", 
"V8zo", "oys6", "67ss"]
    let res = ''
    time.split('').forEach(item => {
        res += list[item * 1]
    })
    const header = Math.random().toString(16).substring(3, 12).toUpperCase()
    return header + window.btoa(res + "+++78S5dz")
}

1.为了保证不能被直接解base64,加了3的倍数(9)长度的前缀(偷看了base64解密过程)

        即使知道是用base64加密的,而且知道除去前9位(不一定是9,3的倍数都行),解出来时这样的: 不知道密码数组一样不行

"pOt#IioV1?/n9_*1V8zo67sss5lppOt#9_*1s5lpnz9I9_*1#239+++78S5dz"

2.加入了尾缀,可用作后端解密条件之一

3.总之 就是加密当前时间戳,然后用密码数组加密,后端用同样的密码数组还原

function decodeBase64(r) {
    var o = String(r).replace(/=+$/, "");
    if (o.length % 4 === 1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
    for (var n, a, i = 0, c = 0, d = ""; a = o.charAt(c++); ~a && (n = i % 4 ? 64 * n + a : a, i++ % 4) ? d += String.fromCharCode(255 & n >> (-2 * i & 6)) : 0)a = e.indexOf(a);
    return d
}


// koa2 中间件内部

 let { xpofz } = ctx.request.headers
    if(!xpofz) {
        ctx.throw(404, "Not found")
        return
    }
    xpofz = xpofz.substr(9)
    const o = decodeBase64(xpofz).split("+++")[0]
    const list = ["s5lp", "pOt#", "#239", "9_*1", "1?/n", "nz9I", "IioV", "V8zo", "oys6", "67ss"]
    let l = ''
    for(let i=0; i < o.length; i+=4) {
        const index = list.indexOf(o.substr(i, 4))
        if(index === -1 ) {
            ctx.throw(401, "Authorization failed")
            return
        }
        l += list.indexOf(o.substr(i, 4))
    }
    const timeDelta = new Date().getTime() - Number(l)
    if(timeDelta > 1000 * 30) {
        ctx.throw(408, "30s timeout")
    } else {
        await next()
    }

1.此header头必须存在才能访问

2.此header头必须通过合适的加密方式才能被后台解密成功

3.此header头不能重复使用

4.多重加密 保证安全

可以作为简单的加解密方式的参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值