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

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分步实现一个出生日期的正则表达式攻略包括以下步骤: 1. 确定正则表达式的格式 根据出生日期的格式,确定正则表达式的格式,例如中国大陆的格式通常为YYYY-MM-DD,美国通常为MM/DD/YYYY或者DD/MM/YYYY,可以针对不同的格式进行相应的正则表达式编写。例如,针对中国大陆的格式,我们可以编写如下正则表达式: ^\d{4}-(…

    JavaScript 2023年6月10日
    00
  • AJAX的使用方法详解

    关于”AJAX的使用方法详解”,我可以给你提供以下信息: AJAX的使用方法详解 基本概念 AJAX(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。它通过异步的方式与服务器进行数据交互,不需要刷新整个页面就可以实现部分内容的更新和任意的服务器通信。 AJAX的优点 可以部分更新网页,提高用户的操作体验; 可…

    JavaScript 2023年6月11日
    00
  • js实现时钟定时器

    关于JS实现时钟定时器的攻略如下: 确定设计思路 1.获取当前时间2.计算时针、分针、秒针的位置3.将时针、分针、秒针对应的角度应用到实际页面上 获取当前时间 我们需要获取当前的系统时间,这可以通过JS的Date对象实现。使用 new Date() 可以初始化一个Date对象,然后分别获取当前时间的小时、分钟、秒等信息。 const now = new Da…

    JavaScript 2023年5月27日
    00
  • 基于React路由跳转的几种方式

    根据你的需求,我会简要介绍一下关于基于React路由跳转的几种方式,并提供两个实例说明。 1. React Router React Router 是一个开源库,可以帮助我们创建单页应用。它可以轻松管理路由,并帮助我们构建动态 UI。React Router 的基本用法如下: import { BrowserRouter as Router, Route, …

    JavaScript 2023年6月11日
    00
  • JavaScript与DOM组合动态创建表格实例

    下面我来详细讲解如何使用JavaScript与DOM组合动态创建表格实例。 简介 在Web开发中,表格是数据展示的常用形式之一,但是在页面中手动编写表格代码比较繁琐,因此我们可以使用JavaScript与DOM结合创建表格。 创建表格的步骤 1.创建表格元素 首先需要使用JavaScript创建表格元素,可以使用document.createElement方…

    JavaScript 2023年6月10日
    00
  • Javascript之旅 对象的原型链之由来

    (一)对象的原型链由来 在 JavaScript 中,每个对象都有一个原型对象。原型对象充当着对象的模板,它包含了常用的属性和方法,子对象可以通过原型链继承这些属性和方法。 每个对象都可以通过__proto__属性访问它的原型对象,对象的原型对象也可以拥有自己的原型对象,这就是所谓的原型链。 但是,面对大量对象,JavaScript 在内存中会保存很多原型对…

    JavaScript 2023年6月10日
    00
  • JavaScript中数组成员的添加、删除介绍

    JavaScript中数组成员的添加、删除介绍 JavaScript中的数组是一种特殊的对象,我们可以通过数组索引将多个值存储在其中,并可以方便地进行添加、删除等操作。 添加元素 JavaScript提供了多种向数组中添加元素的方法: 1. push() push() 方法可以在数组的末尾添加一个或多个元素,并返回数组的新长度。 let arr = [‘ap…

    JavaScript 2023年5月27日
    00
  • js取滚动条的尺寸的函数代码

    JavaScript取得滚动条的尺寸通常需要创建一个函数,以下为具体的实现方式: 创建获取滚动条尺寸的函数 function getScrollWidth() { var div = document.createElement(‘div’); // 设置样式,避免在计算尺寸时产生影响 div.style.width = ‘100px’; div.style…

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