JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64 - Python/JS实现

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式常见的加密算法基本分为这几类:(1)base64编码伪加密(2)线性散列算法(签名算法)MD5(3)安全哈希算法 SHAI(4)散列消息鉴别码 HMAC(5)对称性加密算法 AES,DES(6)非对称性加密算法 RSA

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64 - Python/JS实现

文章目录

前言

一、编码,加密?

1. 什么是编码?

2. 什么是加密?

二、常见编码

1.Base64

2. Base64 - JS实现

3. Base64 - Python实现

4.Unicode

5.Urlencode

三、线性散列算法(签名算法)MD5

1.MD5介绍

2. MD5 - JS实现

3. MD5 - Python实现

四、安全哈希算法 SHAI

1. SHAI - JS实现

2. SHAI - Python实现

五、散列消息鉴别码 HMAC

1.HMAC - JS实现

2. HMAC - Python实现

六、对称加密 AES、DES

1. AES,DES介绍

2. AES - JS实现

3. DES - JS实现

4. DES - Python实现

七、非对称加密RSA

1. RSA介绍

2. JS-代码示例

总结

前言

本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式
常见的加密算法基本分为这几类:
(1)base64编码伪加密
(2)线性散列算法(签名算法)MD5
(3)安全哈希算法 SHAI
(4)散列消息鉴别码 HMAC
(5)对称性加密算法 AES,DES
(6)非对称性加密算法 RSA


提示:以下是本篇文章正文内容,下面案例可供参考

一、编码,加密?

1. 什么是编码?

编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码;

2. 什么是加密?

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。

二、常见编码

1.Base64

base64是基于64个可打印ascii字符对任意字节数据进行编码算法,base64是一种编码方式而不是加密算法。只是看上去像是加密而已;
Base64使用A--Z,a--z,0--9,+,/ 这64个字符实现对数据进行加密。

2. Base64 - JS实现

<html>
    <script type="text/javascript">
        // 创建Base64对象
        var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
        // 定义字符串
        var string = 'i am xz!';
        // 加密
        var encodedString = Base64.encode(string);
        alert(encodedString);
        // 解密
        var decodedString = Base64.decode(encodedString);
        alert(decodedString);
    </script>
</html>            

控制台打印

3. Base64 - Python实现

import base64                                   
                                          
str1 = 'i am xz'                                
str_encode = base64.b64encode(str1.encode())    
print("Base64编码:", str_encode)                  
str_decode = base64.b64decode(str_encode)       
print("Base64解码:", str_decode)                  

控制台打印

4.Unicode

Unicode是计算机中字符集,编码的一项业界标准,被称为统一码,万国码,表现形式一般以"\u"或""开头;

5.Urlencode

urlencode是URL编码,也称作百分号编码,用于把url的符号进行转换;

三、线性散列算法(签名算法)MD5

1.MD5介绍

MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value)。
特征:MD5加密之后产生的是一个固定长度(32位或16位)的数据,常规讲MD5是不存在解密的。
使用场景:注册账号时的密码一般都是用的MD5加密。

2. MD5 - JS实现

<!DOCTYPE html>
<html lang="en">
    <!-- md5源码地址:https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js -->
    <!-- md5常用于登录-->
    <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
    <script type="text/javascript">
        var str1 = 'i am xz'
        var str_encode = md5(str1);
        alert(str_encode) // 在弹窗中输出文本 f0404c7b9bff0bde8d6df8b64759960f
    </script>
</html>  

控制台打印

3. MD5 - Python实现

import hashlib                
                              
str1 = 'i am xz'              
m = hashlib.md5()             
m.update(str1.encode('utf-8'))
str_encode = m.hexdigest()    
print("MD5加密:", str_encode)  # MD5加密: f0404c7b9bff0bde8d6df8b64759960f      

控制台打印

四、安全哈希算法 SHAI

1. SHAI - JS实现

<!DOCTYPE html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script>
        var str1 = 'i am xz';
        var str_encode = CryptoJS.SHA1(str1).toString(); // 注意:1是数字1
        alert(str_encode)  // 0e9f44d42516562396d7b8923542a6a4fc29cd5c
    </script>
</html>           

控制台打印

2. SHAI - Python实现

import hashlib
                                                                   
sha1 = hashlib.sha1()                                                            
str1 = 'i am xz'                                                                 
sha1.update(str1.encode())                                                       
str_encode = sha1.hexdigest()                                                    
print("SHAI加密:", str_encode)  # SHAI加密: 0e9f44d42516562396d7b8923542a6a4fc29cd5c           

控制台打印

五、散列消息鉴别码 HMAC

1.HMAC - JS实现

<!DOCTYPE html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script>
        var key = 'key';
        var str1 = 'i am xz';
        var hash = CryptoJS.HmacSHA256(key, str1);
        var str_encode = CryptoJS.enc.Hex.stringify(hash);
        alert(str_encode)  // '11a7960cd583ee2c3f1ed910dbc3b6c3991207cbc527d122f69e84d13cc5ce5c'
    </script>
</html>  

控制台打印

2. HMAC - Python实现

import hmac                                                                                                 
import hashlib                                                                                              
key = 'key'                                                                                                 
str1 = 'i am xz'                                                                                            
mac = hmac.new(key=key.encode(), msg=str1.encode(), digestmod=hashlib.sha256)                               
mac.digest()                                                                                                
str_encode = mac.hexdigest()                                                                                
print("HMAC加密:", str_encode)  # HMAC加密: e5137adac855050a62c7434b01bb97229f9e1a8fd5b45364e4035d28885b0852       

控制台打印

六、对称加密 AES、DES

1. AES,DES介绍

AES和DES的区别:加密后密文长度的不同,DES加密后密文长度是8的整数倍,AES加密后密文长度是16的整数倍;
特征:对称加密特征,加密和解密需要相同的密钥DES;
应用场景:企业级开发使用DES足够安全,要求高使用AES;

2. AES - JS实现

<html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
          var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
          var message = "i am xz";  // 需要加密的内容
          // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
          var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容
              {
                mode: CryptoJS.mode.ECB, // 为DES的工作方式
                padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
             }
          ).toString(); // toString=转字符串类型

          alert(encrypt); // 在弹窗中打印字符串 2vcsEDJv9vAZZLgFLjkZ9A==

          //解密
          var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容
              {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
              }
          ).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码
          alert(decrypt); // "i am xz"
    </script>
</html>                                                                                                                                                                                                                                                                                                                                      

控制台打印

3. DES - JS实现

<html>
     <!-- 对称加密特征,加密和解密需要相同的密钥DES,AES-->
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
          var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
          var message = "i am xiaozhou ?";  // 需要加密的内容
          // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
          var encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容
              {
                mode: CryptoJS.mode.ECB, // 为DES的工作方式
                padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
             }
          ).toString(); // toString=转字符串类型

          alert(encrypt); // 控制台打印 CDVNwmEwDRM

          //解密
          var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容
              {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
              }
          ).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码
          alert(decrypt); // 控制台打印 "i am xiaozhou ?"
    </script>
</html>                                                                                                                                                                                       

控制台打印

4. DES - Python实现

pip 安装: pip intall pyDes -i https://pypi.tuna.tsinghua.edu.cn/simple

import binascii                                                                                                
from pyDes import des, CBC, PAD_PKCS5                                                                          
                                                                                                               
deskey = '12345678'                                                                                            
message = 'i am xz'                                                                                            
des_encrypt = des(key=deskey, mode=CBC, IV=deskey, padmode=PAD_PKCS5)                                          
str_encode = binascii.b2a_hex(des_encrypt.encrypt(message, padmode=PAD_PKCS5))  # .decode('utf-8')             
print("DES加密:", str_encode)  # DES加密: b'b8a5ac525c77aad0'                                                                                                                                                     
                                                                                                               
str_decrypt = des(key=deskey, mode=CBC, IV=deskey, padmode=PAD_PKCS5)                                          
str_decode = str_decrypt.decrypt(binascii.a2b_hex(str_encode), padmode=PAD_PKCS5)                              
print("DES解密:", str_decode)  # DES解密: b'i am xz'                                                                                                                                                                                                                                                                                                                                        

控制台打印

七、非对称加密RSA

1. RSA介绍

特征:加密使用公钥,解密使用私钥,公钥(可以公开暴露出来只能加密),私钥(必须隐藏),成对出现, 私匙是通过公匙计算生成的,不能盲目随机生成,可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密;
公私匙在线生成:http://web.chacuo.net/netrsakeypair
应用场景:公开密钥加密和电子商业中RSA被广泛使用,支付密码会通过RSA加密;

2. JS-代码示例

<html>
    <!-- 公私匙可以在线生成:http://web.chacuo.net/netrsakeypair -->
    <!-- 非对称加密特征,加密使用公钥和解密使用私钥,公钥(可以公开暴露出来,只能加密)和私钥(必须隐藏)成对出现,公钥和私钥有着某种联系 RSA -->
    <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
    <script type="text/javascript">
        // 公钥 私匙是通过公匙计算生成的,不能盲目设置
        var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
        //私钥
        var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
        //使用公钥加密
        var encrypt = new JSEncrypt();//实例化加密对象
        encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
        var message = 'hello xiaozhou!' // 需要加密的数据 
        var encrypted = encrypt.encrypt(message);//对指定数据进行加密
        alert(encrypted)  // 'JQ83h8tmJpsSZcb4BJ3eQvuqIAs3ejepcUUnoFhQEvum8fA8bf1Y/fG+DO1bSIVNJF6EOZKe4wa0njv6aOar9w=='
        //使用私钥解密
        var decrypt = new JSEncrypt(); // 创建解密对象
        decrypt.setPrivateKey(PRIVATE_KEY); //设置私钥
        var uncrypted = decrypt.decrypt(encrypted); //解密 'hello xiaozhou!'
        alert(uncrypted);
    </script>
    <!-- 总结:可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密 -->
</html>

控制台打印


总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了JS的常见加密以及JS和Python(部分)的实现,后续有常用的JS加密会在这篇博客中持续更新;

目录
相关文章
|
18天前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
24天前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
29 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
24天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
22 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
25天前
|
数据安全/隐私保护 Python
python学习十一:python常用模块使用,如 加密模块pyarmor,时间模块time等
这篇文章介绍了Python中两个常用模块的使用:加密模块pyarmor用于保护代码,以及时间模块time用于处理时间相关的功能。
26 0
|
28天前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
|
30天前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
61 0
|
3天前
|
SQL 安全 测试技术
网络安全的盾牌与剑——漏洞防御与加密技术解析
【10月更文挑战第28天】 在数字时代的浪潮中,网络空间安全成为我们不可忽视的战场。本文将深入探讨网络安全的核心问题,包括常见的网络安全漏洞、先进的加密技术以及提升个人和组织的安全意识。通过实际案例分析和代码示例,我们将揭示黑客如何利用漏洞进行攻击,展示如何使用加密技术保护数据,并强调培养网络安全意识的重要性。让我们一同揭开网络安全的神秘面纱,为打造更加坚固的数字防线做好准备。
17 3
|
1天前
|
安全 算法 网络安全
网络防御的艺术:揭秘加密技术与安全意识的重要性
【10月更文挑战第30天】在数字化时代,网络安全已成为我们生活中不可或缺的部分。本文旨在揭示网络安全漏洞的成因,探讨如何通过加密技术和提升安全意识来构建坚固的网络防线。文章将深入分析常见的安全威胁,并分享实用的防护策略,帮助读者在日益复杂的网络环境中保持警觉和安全。
48 29
|
2天前
|
安全 网络安全 数据安全/隐私保护
数字堡垒的裂缝与钥匙——网络安全漏洞、加密技术与安全意识的博弈
【10月更文挑战第28天】在数字化时代的浪潮中,网络世界如同一座座坚固的堡垒,保护着数据的安全和隐私。然而,这些堡垒并非不可攻破。网络安全漏洞的存在,如同隐藏在城墙之下的裂缝,时刻威胁着堡垒的安全。而加密技术,则是守护这些堡垒的金钥匙,它能够将信息转化为只有授权者才能解读的密文,确保通信的安全。但是,即便有了最先进的加密技术,如果缺乏足够的安全意识,这座堡垒也会变得脆弱不堪。因此,了解网络安全漏洞、掌握加密技术,并培养良好的安全意识,是我们在数字世界中保护自己的重要手段。
|
2天前
|
存储 安全 算法
网络安全与信息安全:漏洞、加密技术及安全意识的重要性
如今的网络环境中,网络安全威胁日益严峻,面对此类问题,除了提升相关硬件的安全性、树立法律法规及行业准则,增强网民的网络安全意识的重要性也逐渐凸显。本文梳理了2000年以来有关网络安全意识的研究,综述范围为中国知网中篇名为“网络安全意识”的期刊、硕博论文、会议论文、报纸。网络安全意识的内涵是在“网络安全”“网络安全风险”等相关概念的发展中逐渐明确并丰富起来的,但到目前为止并未出现清晰的概念界定。此领域内的实证研究主要针对网络安全意识现状与问题,其研究对象主要是青少年。网络安全意识教育方面,很多学者总结了国外的成熟经验,但在具体运用上仍缺乏考虑我国的实际状况。 内容目录: 1 网络安全意识的相关