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:已设置保密