JavaScript加密解密7种方法总结分析

yizhihongxing

JavaScript加密解密7种方法总结分析

JavaScript加密解密是前端工程师必须掌握的技能之一,本文总结了7种常见的JavaScript加密解密方法,并且提供了详细的代码示例。

1. Base64编码与解码

Base64是一种将二进制数据编码为文本的编码规则,其不仅可以用于前端加密解密,也可以用于图片、音频等二进制数据的传输。具体的编码和解码方法如下:

编码:

function base64Encode(str){
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        enc = "",
        tmp_arr = [];

    if (!str) {
        return str;
    }

    str = unescape(encodeURIComponent(str))

    do {
        // pack three octets into four hexets
        o1 = str.charCodeAt(i++);
        o2 = str.charCodeAt(i++);
        o3 = str.charCodeAt(i++);

        bits = o1 << 16 | o2 << 8 | o3;

        h1 = bits >> 18 & 0x3f;
        h2 = bits >> 12 & 0x3f;
        h3 = bits >> 6 & 0x3f;
        h4 = bits & 0x3f;

        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < str.length);

    enc = tmp_arr.join('');

    var r = str.length % 3;

    return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
}

解码:

function base64Decode(str){
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        dec = "",
        tmp_arr = [];

    if (!str) {
        return str;
    }

    str = str.replace(/[^A-Za-z0-9+/=]/g, "");

    do {
        // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(str.charAt(i++));
        h2 = b64.indexOf(str.charAt(i++));
        h3 = b64.indexOf(str.charAt(i++));
        h4 = b64.indexOf(str.charAt(i++));

        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

        o1 = bits >> 16 & 0xff;
        o2 = bits >> 8 & 0xff;
        o3 = bits & 0xff;

        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < str.length);

    dec = tmp_arr.join('');

    return decodeURIComponent(escape(dec.replace(/\0+$/, '')));
}

举一个Base64编码和解码的例子:

var str = "Hello, world!";
var encoded = base64Encode(str); // "SGVsbG8sIHdvcmxkIQ=="
var decoded = base64Decode(encoded); // "Hello, world!"

2. 对称加密算法

对称加密算法指的是加密和解密使用相同密钥的加密算法,简单、高效,常见的对称加密算法有DES、3DES、AES等。

此处以AES加密算法为例,加密解密使用的是同一根秘钥,加密和解密方法如下:

var key = CryptoJS.enc.Utf8.parse("1234567812345678"); //16位秘钥
var iv = CryptoJS.enc.Utf8.parse('1234567812345678'); //16位向量
var encrypted = CryptoJS.AES.encrypt("Hello, world!", key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
    iv: iv,
    padding: CryptoJS.pad.Pkcs7
});
var decryptedStr = decrypted.toString(CryptoJS.enc.Utf8); // "Hello, world!"

3. 非对称加密算法

非对称加密算法指的是加密和解密使用不同密钥的加密算法,常用的非对称加密算法有RSA、DSA等。

下面是RSA加密算法的加密解密方法:

// 生成密钥对
var keySize = 512;
var keyPair = cryptico.generateRSAKey("test", keySize);

// 获取公钥和私钥
var publicKey = cryptico.publicKeyString(keyPair);
var privateKey = cryptico.privateKeyString(keyPair);

// 使用公钥加密
var message = "Hello, world!";
var encrypted = cryptico.encrypt(message, publicKey);

// 使用私钥解密
var decrypted = cryptico.decrypt(encrypted.cipher, keyPair);

var decryptedPlainText = decrypted.plaintext; // "Hello, world!"

4. MD5哈希

MD5是一种常用的哈希算法,用于产生哈希值,其特点是不可逆、不可撤销、不可复原,使用md5.js库实现MD5加密解密:

var md5 = require("md5.js");
var str = "Hello, world!";
var hash = new md5().update(str).digest("hex"); //"86fb269d190d2c85f6e0468ceca42a20"

5. SHA1哈希

SHA1也是一种常用的哈希算法,同样不可逆、不可撤销、不可复原,SHA1.js库提供了SHA1加密解密的实现方法:

var SHA1 = require("sha.js");
var str = "Hello, world!";
var sha1 = new SHA1("SHA-1", "TEXT");
sha1.update(str);
var hash = sha1.digest("hex"); //"943a702d06f34599aee1f8da8ef9f7296031d699"

6. HMAC哈希

HMAC是一种用于消息鉴别的机制,基于哈希函数和密钥,在消息传输过程中防止消息被篡改。HMAC.js库提供了HMAC算法的实现:

var hmacSha256 = require("crypto-js/hmac-sha256");
var message = "Hello, world!";
var secret = "1234567812345678";
var hmac = hmacSha256(message, secret);
var hash = hmac.toString(); // "54d9d6fd12cb8a46b8f2aaeb7d2358f0b456f39b07fe92706a08d409c5aa9db3"

7. PBKDF2哈希

PBKDF2是一种基于密码的密钥推导函数,可以从密码导出密钥,形成合适长度的密钥,从而降低攻击成本。PBKDF2.js库提供了PBKDF2加密解密的实现方法:

var pbkdf2 = require("pbkdf2");
var password = "123456";
var salt = "salt"; //盐值
var keyLen = 256 / 32; //256位
var iterations = 1000; //迭代次数

var encPassword = pbkdf2.pbkdf2Sync(password, salt, iterations, keyLen, "sha256"); //buffer类型

var hash = encPassword.toString("hex"); // "059b15100f56d0e7d8f8c0ebd1f9238fe63ae5fd17575a2bcd5c0d1f058f5949"

以上是JavaScript加密解密7种方法的总结分析,每种加密方法都包含了详细的代码示例,以便读者实践和参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript加密解密7种方法总结分析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JavaScript数组实现数据结构中的队列与堆栈

    JavaScript数组实现数据结构中的队列与堆栈 简介 JavaScript数组是一种有序、可变的数据结构,适用于实现数据结构中的队列和堆栈。队列和堆栈都是抽象数据类型,可以通过数组来实现。 队列 队列是一种先进先出(FIFO)的数据结构,比如排队买票,队首先到达的人先买到票。可以通过JavaScript数组模拟队列的实现。 排队买票的例子 下面是一个使用…

    JavaScript 2023年5月27日
    00
  • js读取注册表的键值示例

    下面我将详细讲解“js读取注册表的键值示例”的完整攻略。 什么是注册表 在Windows操作系统中,注册表是一种存储操作系统和应用程序配置信息的数据库。它是一个层次结构,由各种键和值组成。某些常用应用程序的配置信息也将在该注册表中保存。 读取注册表键值的方法 在JavaScript中,读取注册表的键值可以通过Windows Script Host提供的COM…

    JavaScript 2023年6月10日
    00
  • Ajax,UTF-8还是GB2312 eval 还是execScript

    下面是关于Ajax、UTF-8与GB2312、eval与execScript的详细讲解以及示例: Ajax Ajax是一种异步的Web开发技术,可以在不刷新整个页面的情况下更新部分页面的内容。Ajax采用异步通信的方式,通过浏览器与服务器之间的数据交互,在不影响用户体验的情况下异步地向服务器请求数据并将响应的数据动态地显示到页面中。Ajax涉及到的技术包括H…

    JavaScript 2023年5月19日
    00
  • javascript 保存文件到本地实现方法

    下面是关于“JavaScript保存文件到本地实现方法”的攻略: 简介 在Web应用程序中,有时可能需要将用户生成的数据以文件的形式保存到本地硬盘,以备以后离线查看或者处理。这个时候,可以使用JavaScript来实现将数据保存到本地的功能。本文将介绍两种常用的方法。 方法一:使用Blob和URL.createObjectURL() 该方法的核心是使用Blo…

    JavaScript 2023年5月27日
    00
  • Javascript Date toGMTString() 方法

    以下是关于JavaScript Date对象的toGMTString()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的toGMTString()方法 JavaScript的toGMTString()方法返回一个表示对象日期和时间部分的字符串,该字符串为格林威治标准时间(GMT)。 下面是使用对象的toGMTString()方法的示例…

    JavaScript 2023年5月11日
    00
  • webpack output.library的16 种取值方法示例

    下面我将为你详细讲解关于“webpack output.library的16种取值方法示例”的完整攻略。 首先,我们需要了解output.library的含义。output.library是指将你的一些 JavaScript 代码打包到一个或多个库(library)中,使得其在浏览器环境或 Node.js 环境中能够被其他地方引用和使用。它的取值方式是一个字…

    JavaScript 2023年6月10日
    00
  • prettier自动格式化去换行的实现代码

    Prettier 自动格式化去换行的实现 Prettier 是一款代码格式化工具,能够自动为代码添加缩进、格式化代码样式等特性,并且运行速度较快,常用于开发中的自动化构建流程中。Prettier 在格式化代码时会默认去掉多余的换行,本文将详细介绍 Prettier 自动格式化去换行的实现。 安装 Prettier 使用 npm 命令安装 Prettier n…

    JavaScript 2023年6月11日
    00
  • JFinal使用ajaxfileupload实现图片上传及预览

    以下是使用 JFinal 和 ajaxfileupload 实现图片上传及预览的完整攻略。 准备工作 首先,你需要在你的项目中引入 JFinal 和 ajaxfileupload,具体引入方式可以参考官方文档。 接着,你需要准备一个接口用于接收上传的图片,并返回图片的路径或其他信息,可以在你的 JFinal Controller 中编写一个如下的示例方法: …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部