关于忘记密码重置问题,在面试时经常被问到。这道面试题大家在生活中大部分都亲身经历过。注册了某个网站,过一段时间不用,重新登录时,忘记了密码,点击找回密码功能,进行身份验证后,要求重置密码。为什么网站不直接返回原始密码给我们呢?
其实网站本身也不知道原始密码,在网站后台数据库中只记录你注册时原始密码加密后的密文,而密文是不可逆的,也就是密文不能还原回明文密码。
相信经常关注新闻的同学应该知道,国内某大型技术社区,数据库服务器被黑客攻破,所有注册用户的账户名和密码被晒到网上,密码只进行了简单的对称加密,很容易就被破解。据说某个大v的账户破解后里面的内容被篡改。 如果是不可逆加密,即使数据库被攻破密码被看到,也是无法使用账户进行登录操作。
面试官继续追问:你知道加密算法有哪些吗?能否详细说明?
认真看完这篇文章系统告诉你加密相关知识。
01
加密概述
加密是一种将明文信息转换为只有授权用户才能解读的密文信息的过程。它在信息安全领域扮演着至关重要的角色,用于保护数据的机密性、完整性和可用性。
- 密码常用术语
明文: 待加密码信息
密文: 经过加密后的明文
加密: 明文转为密文的过程
加密算法: 明文转为密文的转换算法
加密密钥: 通过加密算法进行加密操作用的密钥
解密: 将密文转为明文的过程
解密算法: 密文转为明文的算法
解密密钥:通过解密算法进行解密操作用的密钥
- 现代密码学设计原则
柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥 保密,对算法公开。
02
加密算法
常用加密算法有对称加密、非对称加密和哈希不可逆加密。它们在什么场景下使用,具体代码使用方法是什么,我们来一起看下。
- 对称加密
指加密和解密使用相同密钥的加密算法。对称加密算法的原理很容易理解,通信一方用KEY 加密明文,另一方收到之后用同样的KEY来解密就可以得到明文。
常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES
优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
缺点: 没有非对称加密安全.
用途:一般用于保存用户手机号、身份证等敏感但能解密的信息。
示例-crypto.js库
<script src="./lib/js/crypto-js.js"></script>
<script>
//Encrypt加密
var message='2042.12.12 14:10攻打海湾'
var key='cdkey'//秘钥
var ciphertext=crypo]s.AEs.encrypt(message, key).tostring();
//U2FsdGVkX18AztWSDj0grGvTCpa0HquP1CSM7G9E/1Yd7u4VvM5+yLFkhfWcas/N
// Decrypt 解密
var bytes =cryptoJs.AEs.decrypt(ciphertext, key);var originalText=bytes.tostring(cryptojs.enc.Utf8);
console.log(originalText);//'2042.12.12 14:10攻打海湾'
</script>
- 非对称加密
非对称加密算法,使用两把完全不同但又是完全匹配的一对Key:公钥和私钥。在使用非对称 加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程
优点: 非对称加密与对称加密相比,其安全性更好;
缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
用途:一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用 于对于令牌或者签名的解密或者校验使用.
常见的非对称加密算法有:RSA、DSA(数字签名用)、ECC(移动设备 用)、RS256 (采用SHA-256 的 RSA 签名)
规则:公钥加密,私钥解密
RSA加密实现
1. RSA秘钥生成方式
Mac系统内置OpenSSL(开源加密库),所以可以直接在终端上使用命令。
Windows系统可以使用git命令行工具单击鼠标右键——git bash here 调出git bash
1、生成私钥,密钥长度为1024bit
$ openssl genrsa -out private.pem 1024
2、 从私钥中提取公钥
$ openssl rsa -in private.pem -pubout -out public.pem
3、命令行查看
4、RSA在线生成:http://tools.jb51.net/password/rsa_encode
5、rsa加解密库jsencrypt
方式1 引入 <script src="../lib/js/JSEncrypt.js"></script>
方式2 npm install jsencrypt
- 哈希不可逆加密
Hash算法特别的地方在于它是一种单向算法,一旦加密就不能反向解密得到密码原文。常用在不可还原的密码存储、信息完整性校验等。
1. 常见的不可逆加密算法有:MD5、SHA、HMAC
2. 使用方式:在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。
3. SHA算法: 安全散列算法(英语:Secure Hash Alqorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
4. js-sha256库
npm i js-sha256
03
base64算法
对网络通信有所了解的同学,应该都听过Base64编码。例如,我们一段数据通过MD5 、SHA等手段加密后,经过Base64编码为字符串就可以很方便地在网路上传输。那么Base64也算是一种加密算法吗?
Base64并不是一种加密方式,明文使用Base64编码后的字符串通过索引表可以直接还原为明文。因此,Base64只能作为一种数据的存储格式
Base64实现:
//安装 npm install js-base64
const Base64 = require("js-base64").Base64
const pw = Base64.encode(this.passWord)
在线编译工具:http://www.jsons.cn/img2base64/