【前端知识】前端加密算法(base64、md5、sha1、escape/unescape、AES/DES)

前端加密算法

一、base64加解密算法

  • 简介:Base64算法使用64个字符(A-Z、a-z、0-9、+、/)来表示二进制数据的64种可能性,将每3个字节的数据编码为4个可打印字符。如果字节数不是3的倍数,将会进行填充。

  • 优点:

    1. 可打印字符:Base64编码后的数据只包含可打印字符,不会出现乱码或无法传输的情况。
    2. 广泛支持:Base64被广泛支持于各种编程语言和网络协议中,可以方便地应用于各种场景。
    3. 简单易用:Base64的编码和解码很简单,只需要少量的代码即可完成。
  • 缺点:

    1. 数据膨胀:Base64编码后的数据通常比原始数据要大约1/3左右,这意味着在传输大量数据时会增加传输的时间和带宽消耗。
    2. 不加密:Base64只是一种编码方式,而不是加密算法,它并不能提供数据的安全性。
  • 简单实现

    // 加密
    let str_to_base64 = window.btoa(str);
    console.log(str_to_base64);
    // 解密
    let base64_to_str = window.atob(str_to_base64)
    console.log(base64_to_str);
    

二、MD5加密算法(不可逆)

  • 简介:MD5(Message Digest Algorithm 5)是一种常用的加密算法,用于对数据进行加密和解密。它是一种哈希函数,能够将任意长度的数据转换为固定长度的摘要(128位),并且具有不可逆性。

  • 优点:

    1. 快速而高效:MD5算法对数据进行加密和解密的速度很快,特别适用于大规模数据处理。

    2. 简单易用:MD5算法的实现相对简单,使用方便。

    3. 不可逆性:由于MD5算法是单向的哈希函数,所以无法通过摘要反推出原始数据。

  • 缺点:

    1. 容易碰撞:由于MD5摘要的长度固定,而原始数据的长度可以是任意的,因此可能会出现不同的数据生成相同的摘要,即碰撞情况。

    2. 安全性较弱:随着计算能力的提升,现在已经有办法对MD5进行碰撞攻击,即找到两个不同的数据生成相同的摘要。

    3. 不支持加密与解密操作:MD5只能用于生成数据的摘要,无法实现数据的加密和解密。

  • 简单实现

    const md5 = require('./md5.min.js');
    // 加密
    let str_to_md5 = md5(str);
    console.log(str_to_md5);
    

三、sha1加密算法(不可逆)

  • 简介:SHA-1算法是美国国家安全局(NSA)设计的一种安全哈希函数,于1995年发布。它接受输入数据并通过一系列步骤生成唯一的哈希值,该值具有较高的唯一性和不可逆性。SHA-1算法的设计目标是提供数据完整性校验和数字签名等应用。

  • 优点

    1. 简单快速:相对于其他哈希算法,SHA-1算法具有较快的处理速度,并且实现相对简单。

    2. 安全性:SHA-1算法在设计时被认为是安全的,其哈希值的冲突概率很低,使其适用于许多安全应用。

  • 缺点

    1. 强度不足:由于技术进步和计算能力提升,SHA-1算法已经不再被认为是安全的。已经发现了多个针对SHA-1哈希碰撞的攻击方法。

    2. 安全性退化:由于现代计算机能力的提高,攻击者可以使用更强大的硬件和算法来更快地计算SHA-1哈希碰撞。

    3. 不可逆性:SHA-1算法是一种单向散列函数,即无法从哈希值恢复原始数据。这在某些场景下可能是一个缺点。

  • 简单实现

    const sha1 = require('./sha1.min.js');
    // 加密
    let str_to_sha1 = sha1(str);
    console.log(str_to_sha1);
    

四、escape & unescape 编码/解码

  • 简介:escape 和 unescape 是 JavaScript 中提供的编码和解码函数,用于处理特殊字符的转义和恢复。它们的作用是将字符串中的特殊字符转换为编码表示,以便在不同的上下文中进行安全传输或存储,并且可以再次解码以恢复原始字符串。

  • 优点

    1. 简单易用:escape 和 unescape 函数是 JavaScript 内置函数,可以直接调用,无需额外的库或依赖。

    2. 兼容性好:这些函数在大多数主流浏览器中都得到支持,能够在不同的平台和环境中正常工作。

    3. 跨语言支持:由于 escape 和 unescape 是基于 Unicode 编码的,所以在多种编程语言中都可以使用。

  • 缺点

    1. 仅支持 ASCII 字符集:escape 和 unescape 函数只能处理 ASCII 字符,对于非 ASCII 字符(如中文、日文等)需要使用其他编码方式。

    2. 安全性问题:尽管 escape 可以对特殊字符进行编码,但它并不是一种安全的编码方式,因为它并不能完全保护数据免受攻击。在处理用户输入时,应该使用更安全的编码方式,如 encodeURIComponent 或使用服务器端的编码方法。

    3. 不可逆性:escape 和 unescape 是一种简单的编码解码方式,它们是一对一的关系,无法进行数据压缩或加密,也无法恢复被修改的编码结果。

  • 简单实现

    // 编码
    let str_to_escape = escape(str)
    console.log(str_to_escape);
    // 解码
    let escape_to_str = unescape(str_to_escape)
    console.log(escape_to_str);
    

五、AES/DES加解密算法

  • 简介:AES是一种高级加密标准,用于保护敏感数据。它支持128位、192位和256位的密钥长度。AES使用替代/置换网络进行加密,包括四种不同的运算:字节替代、行移位、列混淆和轮密钥加。由于AES使用的操作通常是高效的,因此它比DES更安全且更快。

    DES是最早广泛使用的对称加密算法之一。它使用56位的密钥,并将数据分成64位的块进行加密。DES采用迭代的结构,重复16轮加密过程。每轮使用不同的子密钥对数据块进行变换。然而,由于DES密钥长度较短,因此易受到暴力破解和密码分析的攻击。

  • AES 的优点

    1. 更高的安全性:AES采用更长的密钥长度(128位、192位或256位),提供更高的安全性。

    2. 快速加密/解密速度:由于AES使用的操作较为简单且高效,在相同硬件上与DES相比,AES可以提供更快的加密和解密速度。

    3. 灵活性:AES支持不同的密钥长度,可以根据安全需求进行调整。

  • AES 的缺点

    1. 硬件实现的复杂性:相较于DES,实现AES算法所需的硬件更为复杂,这可能导致一些应用的性能下降。

    2. 密钥管理:由于AES支持多种密钥长度,对密钥的管理可能会更加复杂。

  • DES 的优点

    1. 简单:DES的算法较为简单,易于实现和使用。

    2. 兼容性:由于DES已经被广泛采用并成为密码学标准,在一些遗留系统中仍然使用。

  • DES 的缺点

    1. 安全性较低:由于DES密钥长度较短,易受到暴力破解和密码分析的攻击。

    2. 过时的技术:DES的密钥长度和算法设计已经过时,不再被推荐用于保护敏感数据。

  • 简单实现

    const CryptoJS = require('./crypto-js-3.1.2/package') // CryptoJS中还包含其他各类加密算法
    const aseKey = "outmanAK" // 秘钥必须为:8/16/32位
    //加密
    var str_to_aes = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(aseKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    }).toString();
    console.log(str_to_aes);
    //解密
    var aes_to_des = CryptoJS.AES.decrypt(str_to_aes, CryptoJS.enc.Utf8.parse(aseKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8);
    console.log(aes_to_des);
    
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SHA1加密是一种不可逆的加密算法,我们可以使用JavaScript代码来实现。 下面是一个示例实现: ``` function sha1(str) { var rotate_left = function(n, s) { return (n << s) | (n >>> (32 - s)); }; var cvt_hex = function(val) { var str = ''; for (var i = 7; i >= 0; i--) { str += ((val >>> (i * 4)) & 0x0f).toString(16); } return str; }; var blockstart; var i, j; var W = new Array(80); var H0 = 0x67452301; var H1 = 0xEFCDAB89; var H2 = 0x98BADCFE; var H3 = 0x10325476; var H4 = 0xC3D2E1F0; var A, B, C, D, E; var temp; str = unescape(encodeURIComponent(str)); var str_len = str.length; var word_array = []; for (i = 0; i < str_len - 3; i += 4) { j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3); word_array.push(j); } switch (str_len % 4) { case 0: i = 0x080000000; break; case 1: i = str.charCodeAt(str_len - 1) << 24 | 0x0800000; break; case 2: i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000; break; case 3: i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) << 8 | 0x80; break; } word_array.push(i); while ((word_array.length % 16) != 14) { word_array.push(0); } word_array.push(str_len >>> 29); word_array.push((str_len << 3) & 0x0ffffffff); for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = word_array[blockstart + i]; } for (i = 16; i <= 79; i++) { W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); } A = H0; B = H1; C = H2; D = H3; E = H4; for (i = 0; i <= 19; i++) { temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 20; i <= 39; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 40; i <= 59; i++) { temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 60; i <= 79; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } H0 = (H0 + A) & 0x0ffffffff; H1 = (H1 + B) & 0x0ffffffff; H2 = (H2 + C) & 0x0ffffffff; H3 = (H3 + D) & 0x0ffffffff; H4 = (H4 + E) & 0x0ffffffff; } var sha1_hash = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4); return sha1_hash.toLowerCase(); } ``` 你可以将要加密的字符串传递给 `sha1` 函数,在函数内部实现SHA1加密,并返回加密后的字符串。 注意:在使用此代码时请考虑安全性和实际使用场景,可能需要添加额外的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端Outman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值