Vue-常用加密(MD5,DES,SHA256,BASE64,SHA1,RSA)

x33g5p2x  于10个月前 转载在 Vue.js  
字(3.9k)|赞(0)|评价(0)|浏览(322)

Vue-加密

加密解密介绍

DES

美国 数据加密标准(DES)是对称密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。密钥较短,加密处理简单,加解密速度快,适用于加密大量数据的场合。

前端有时把数据传给后端,也是需要加密的,这里介绍下des加密:
DES 加密算法为最为常见的分组加密算法。其主要思想在于数据位的置换与移位过程,通过16次的迭代加密与最终的逆置换得出最终的密文。DES 的解密方式只需按照加密的逆过程求解即可。由于DES 加密过程的算法是公开的,所以密钥K的保密就显得尤为重要,只有发送方与接收方采用相同的密钥进行加密解密才能获取明文数据。

使用场景:由于算法效率较高,一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行 加密通信时,既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用对称加密算法。

RSA

RSA是 非对称算法,加密密钥和解密密钥是不一样的,或者说不能由其中一个密钥推导出另一个密钥。密钥尺寸大,加解密速度慢,一般用来加密少量数据,比如DES的密钥。

公钥和私钥都可用于加密和解密。公钥和私钥都可以用于加解密操作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加密,但是不同场景使用不同的密钥来加密,规则如下:

私钥用于签名、公钥用于验签。
签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。
私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。

公钥用于加密、私钥用于解密,这才能起到加密作用。
因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!
若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。

使用场景:主要用于秘钥交换,证书等场景。

SHA1

SHA1 和 MD5 是 散列算法,将任意大小的数据映射到一个较小的、固定长度的唯一值。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为 雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。MD5 比 SHA1 大约快 33%。
使用场景:多用于密码储存

MD5

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。

一般登录的用户密码是用md5加密,系统中保存的也是加密后的用户密码,系统并不知道具体的用户密码是什么。

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

使用场景:多用于密码储存

SHA256

SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256。SHA系列算法是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
使用场景: 比特币就是使用SHA256 ,多用于密码储存

使用

第一步安装

npm i -s sha1 crypto-js  jsencrypt   js-sha256 js-base64 crypto    --save

第二部创建加密工具类crypto.js

//保存为crypto.js
import crypto from 'crypto'
import jsSha from 'js-sha256'
import base64 from 'js-base64'
import sha1 from 'sha1'
import rsa from 'jsencrypt';
import des  from 'crypto-js';

//DES对称加密
/* * message:需要加密的字符串,对象加密需要转成json字符串 * key: 密钥(加密解密密钥同一个) */
export const  desEncryptCrtpto =(message, key = 'xxxxxxxxxxxxxxxxxxxxx')=> {
    const keyHex = des.enc.Utf8.parse(key)
    const option = { mode: des.mode.ECB, padding: des.pad.Pkcs7 }
    const encrypted = des.DES.encrypt(message, keyHex, option)
    let data = encrypted.ciphertext.toString() // 返回hex格式密文,如需返回base64格式:encrypted.toString()
    return data
}

/* * message:需要解密的字符串, * key: 密钥(加密解密密钥同一个) */
export const  desDecodeCrtpto =(message, key = 'xxxxxxxxxxxxxxxxxxxxx') =>{
    const keyHex = des.enc.Utf8.parse(key)
    const decrypted = des.DES.decrypt(
        {
            ciphertext: des.enc.Hex.parse(message)
        },// 若message是base64格式,则无需转16进制hex,直接传入message即可
        keyHex,
        {
            mode: des.mode.ECB,
            padding: des.pad.Pkcs7
        }
    )
    let data =  decrypted.toString(des.enc.Utf8)
    return data
}

//md5
export const mdCrtpto = (pwd) => {
    let md5 = crypto.createHash('md5');
    md5.update(pwd);
    return md5.digest('hex');
}

// sha256
export const shaCrypto = (pwd) => {
    return jsSha.sha256(pwd);
}

//Base64
export const baseCrypto = (pwd) => {
    return base64.Base64.encode(pwd);
}

//sha1
export  const sha1Crypto=(params)=>{
    return sha1(params);
}

//rea 非对称加密, 后端生成公秘钥,前端使用公秘钥加密,后端使用私密钥解密
export const  rsaCrypto=(str)=>{
    //实例化rsa
    let jse = new rsa();
    //加密公钥(由服务端生成)
    let pubKey = `-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmBjTNoNbIjrZVoEt5OBNM6zZ/ yDZ7wgv53A6ekTuAsqfJ3jXmLC7PqqrJxgqqDf2l72CnRC8ZxIAkiUBmIK/FIDrl qCBPl1h0Ym8qPLmUuv5l3xmhlb6+a/v22444PW/U6Ur0l1BvbCorrsWV3leFFfLZ 5oT4mq9jXzkQLv8F6wIDAQAB -----END PUBLIC KEY-----`

    jse.setPublicKey(pubKey);
    let  data = jse.encrypt(str.toString());  // 进行加密
    return data;
}

第三步使用

先在需要使用加密的vue文件中导入工具类

//加密算法
//加密算法
import { mdCrtpto, shaCrypto, baseCrypto ,sha1Crypto,rsaCrypto,desDecodeCrtpto,desEncryptCrtpto} from '../utils/crypto';

然后在方法中使用

console.log('md5加密:' + mdCrtpto('123456')); 
      console.log('sha256加密:' + shaCrypto('123456')); 
      console.log('base64加密:' + baseCrypto('123456')); 
      console.log('base64加密:' + sha1Crypto('123456')); 
      console.log('sha1加密:' + sha1Crypto('123456')); 
      const  salt="fesdb13632twfs;'." //盐
      //超复杂加密-基本不可破解
      console.log("超级加密:"+shaCrypto(sha1Crypto((baseCrypto(mdCrtpto(salt + "1234567" + salt))))))

相关文章