md5、aes加密方法介绍与使用

仉磊
2023-12-01

MD5:

MD5全称为信息-摘要算法(哈希算法),是计算机安全领域的散列函数,用于确保消息的完整性。另外摘要算法还有SHA1,具体请度娘。MD5是一种单向加密,它的加密不可逆,它将任意长度的字符串,经过算法计算后生成固定长度的数据,一般为16位表示 。这种加密方式最简单同时也最直接

**过程:**创建账号时,将账号对应密码的MD5存储数据库,登录时,对用户输入的密码进行MD5加密传送到服务器端,根据账号从数据库查询出该账号对应的MD5值进行对比,判断是否相同。MD5也是弱加密

**缺点:**字典表很大。在https://www.cmd5.com ,存储超过90万亿个密码,很快速查询到一些密码强度不复杂的密码。

vue项目使用:

npm安装:

 npm install --save js-md5

引用:

1,局部使用

 npm install --save js-md5

2,全局引用:

import md5 from 'js-md5';
Vue.prototype.$md5 = md5;

使用:

import md5 from 'js-md5'

password: md5.encrypt('需要加密得字符'),// md5.encrypt()方法进行加密

AES:

高级加密标准(AES - Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的),这种加密相对md5更复杂一些,在项目使用中也稍微复制一点点。

过程: 秘钥固定在客户端代码和后端代码中,登录时使用固定密码将明文密码加密传输到后端,后端使用相同的固定秘钥解密,然后查询用户存储在数据库的密码,进行对比认证。

缺点: 秘钥硬编码于客户端代码中,存在泄漏风险。

对称加密算法与非对称加密算法的区别:

1:对称加密算法

加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。

缺点是密钥的传输比较麻烦。

2:非对称加密算法

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。

优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

实际中:一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

vue项目使用:

npm安装:

npm install crypto-js --save-dev

引用:

 npm install --save js-md5

使用:这里需要进行加工一层,封装一些方法使得我们项目使用更方便。

在项目中定义如下方法,我这里是单独放在

import CryptoJS from 'crypto-js'
export default {
  //随机生成指定数量的32进制key
  generatekey(num) {
    const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    let key = ''
    for (let i = 0; i < num; i++) {
      let randomPoz = Math.floor(Math.random() * library.length)
      key += library.substring(randomPoz, randomPoz + 1)
    }
    return key
  },
  //加密
  encrypt(word, keyStr) {
    // 判断是否存在keyStr,不存在就用默认的keyStr(注意:这个keyStr必需要前后端统一,不然双方加密解密后会不相同。)
    keyStr = keyStr ? keyStr : '前后端规定一个秘钥默认值,可以从keyStr传入不传取默认值'
    const key = CryptoJS.enc.Utf8.parse(keyStr)
    const srcs = CryptoJS.enc.Utf8.parse(word)
    const encrypted = CryptoJS.AES.encrypt(srcs, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    })
    return encrypted.toString()
  },
  //解密
  decrypt(word, keyStr) {
    keyStr = keyStr ? keyStr : '前后端规定一个秘钥默认值,可以从keyStr传入不传取默认值'
    const key = CryptoJS.enc.Utf8.parse(keyStr)
    const decrypt = CryptoJS.AES.decrypt(word, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    })
    return CryptoJS.enc.Utf8.stringify(decrypt).toString()
  },
}

具体使用:这里使用也很简单,在使用到得地方局部引入,可以在全局引入,这里只有一个页面用到就使用了局部引入使用。

import aes from '@/util/aes'

password: aes.encrypt('需要加密得字符'), // aes.encrypt就是我们定义的加密方法

参考博客:https://blog.csdn.net/qq_28205153/article/details/55798628

 类似资料: