社区脚本中心 → 浏览:帖子主题
* 帖子主题:前端传参时如何对数据进行安全加密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 1 楼 ] 回复
一、正常不进行请求的加密方式:

app调用:http://api.test.com/api?参数1=1&参数2=2

此方式会存在很严重的安全性问题,没有进行任何的验证,大家都可以通过这个方法获取到信息,导致数据泄露,并有可能会被篡改数据,造成更严重的问题。那么如何验证调用者身份并防止参数被篡改呢?

二、使用MD5进行签名加密
加入一个对应的secret并在调用接口时进行数据验证

1、按照参数名把参数a:1,c:2,b:4进行首字母排序(可使用sort()方法进行排序)并进行拼接得到字符串a1b4c2
2、把secret加到字符串头部后进行MD5加密,加密后的字符串大写后得到签名Sign

app调用即为:http://api.test.com/api?Sign=FSFSDGASF&参数1=1&参数2=2

    加入签名加密后请求多了key和sign参数,这样请求的时候就需要合法的key和正确签名sign才可以获取产品数据。这样就解决了身份验证和防止参数篡改问题,如果请求参数被人拿走,他们因为没有正确的secret所以无法进行数据篡改。

    但是,如果他人拿到完整的请求,使用正常key和sign和一样的参数还是可以获取到数据

三、加入时间戳使请求具有唯一性

请求参数中,我们加入时间戳 ,同样,时间戳作为请求参数之一,也加入sign算法中进行加密。
timestamp = new Date().getTime();

app调用即为:http://api.test.com/api?Sign=FSFSDGASF×tamp=12341232123&参数1=1&参数2=2

2022-11-09 16:03:48 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 2 楼 ] 回复
<html>
    <head>
        <title>>前端js加解密学习过程</title>
    </head>
    <body>
    </body>
<!-- base64 -->
<script>
var str = "beijing";
var str64 = window.btoa(str);
console.log("字符串是:"+str);
console.log("经base64编码后:"+str64);
console.log("base64解码后:"+window.atob(str64));
</script>

<!-- md5 -->
<script src="./md5.js"></script>"></script>
    <script>
        console.log(hex_md5("chen"));           
        console.log(b64_md5("chen"));           
        console.log(str_md5("chen"));           
        console.log(hex_hmac_md5("chen","chen"));           
        console.log(b64_hmac_md5("chen","chen"));           
        console.log(str_hmac_md5("chen","chen"));           
</script>

<!-- sha1 -->
<script src="https://cdn.bootcss.com/js-sha1/0.6.0/sha1.js"></script>
<script type="text/javascript">
        var sha1_1 = sha1("chenhoubo");
        console.log(sha1_1);
        var sha1_2 = sha1("admin:1001");
        console.log(sha1_2);
</script>

<!-- 编码 -->
<script type="text/javascript">
      var escape1 =escape("我的名字是:陈厚伯");//编码
      console.log(escape1);
      var unescape1 = unescape(escape1); //解码
      console.log(unescape1);
</script>

<!-- encrypt/decrypt -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<script type="text/javascript">
    var aseKey = "12345678"    //秘钥必须为:8/16/32位
    var message = "13785624612";

    //加密
    var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    }).toString();
    console.log(encrypt);

    //解密
    var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8);
    console.log(decrypt);    //13785624612

</script>


</html>
2022-11-09 16:05:24 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 3 楼 ] 回复
btoa和atob是window对象的两个函数,其中btoa是binary to ASCII,用于将binary的数据用ASCII码表示,即Base64的编码过程,而atob则是ASCII to binary,用于将ASCII码解析成binary数据,即Base64的解码过程[1]

ASCII码大家基本都知道,这里讲下binary是什么。

binary 是JS字符集的另外一个子集,它类似于 ASCII 字符集,但是字符的码点(charCode)不再限制到 127, 它包含了255 以内的字符。binary string设计的目的不是用于代表字符, 而是代表二进制数据。由 binary string 代表的二进制数据大小是原始数据的两倍,然而这对于最终用户是不可见的, 因为JavaScript strings 的长度是以2字节为单位进行计算的。比如, “Hello world” 这个字符串属于 ASCII 子集, 而 ÀÈÌÒÙ 不属于ASCII码[2],但属于binary。

所以btoa和atob其实还涉及了编码问题,我们只需要找出相同编码进行替换即可。在node.js环境中,提供了一个 Buffer 类,用于操作二进制及Base64转码。而在Python环境中,有一个 Latin1 编码[3]与JS的binary相同,因此可以构造代码了。

一、node.js环境
1.直接安装btoa-atob库(不推荐)
2.通过Buffer类实现转换

// atob
var s = new Buffer.from("待解码的字符", "base64").toString("binary")
// btoa
var s = new Buffer.from("待编码的字符", "binary").toString("base64")
2022-11-09 17:31:13 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 4 楼 ] 回复

[前端]js原生Base64转码和解码函数btoa和atob的使用

2020-08-28 19:00:49 分类 / 网络编程 来源 / 互联网
定义atob():解码一个Base64字符串。
btoa():从一个字符串或者二进制数据编码一个Base64字符串。


兼容性

window.btoa和window.atob在现代浏览器中受到广泛的支持。  支持浏览器如下:
IE:10+
Chrome:4+
Firefox:2+
Safari:3.1+
Opera:11.5+ 


使用

只有字符串才能被转换。码位须在 0x00 ~ 0xFF 范围
1.默认转换 ASCII字母和数字,不支持中文

// 转base64
var aa = btoa("dddddddd");
// 转码结果 "ZGRkZGRkZGQ="

// 解码结果
var bb  = atob(aa);
// 解码结果 "dddddddd"

// 注意,如果想转换中文会直接报错,具体方法见下文
// 中文转换base64
var cc = btoa("哈哈");
// 直接报错 VM275:1 Uncaught SyntaxError: Invalid or unexpected token


2.转换中文的方法

// 先将中文转换为URL组件格式,再转为base64形式的
var dd = btoa(encodeURIComponent("哈哈"));
// 结果 "JUU1JTkzJTg4JUU1JTkzJTg4"

// 注意解析时就需要先解码为URL组件格式,再转换为中文,就是先进后出的原则
var ff = decodeURIComponent(atob(dd));
// 结果 "哈哈"


为了考虑兼容性,就需要我们封装一个base64方法,该如何实现呢?请参考之前的一篇文章,地址:http://www.aidi.net.cn/article/detial/390

2022-11-09 17:45:48 IP:已设置保密
分页: 1, 共 1 页
快速回复主题
账号/密码
用户: 没有注册?密码:
评论内容