密码安全及前端字符串加密的几种方法 |
您所在的位置:网站首页 › 字符串简单的加密和解密 › 密码安全及前端字符串加密的几种方法 |
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。 身份验证过程中会涉及到密钥, 对称加密,非对称加密,摘要的概念: 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。 对称加密:对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有 DES、3DES、TDEA、Blowfish、RC5 和 IDEA。 非对称加密:非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。 摘要:摘要算法又称哈希/散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用 16 进制的字符串表示)。算法不可逆。 加盐对于密码存储来说,必然是不能明文存储在数据库中的,否则一旦数据库泄露,会对用户造成很大的损失。并且不建议只对密码单纯通过加密算法加密,因为存在彩虹表的关系 通常需要对密码加盐,然后进行几次不同加密算法的加密 // 加盐也就是给原密码添加字符串,增加原密码长度 sha256(sha1(md5(salt + password + salt)))但是加盐并不能阻止别人盗取账号,只能确保即使数据库泄露,也不会暴露用户的真实密码。一旦攻击者得到了用户的账号,可以通过暴力破解的方式破解密码。对于这种情况,通常使用验证码增加延时或者限制尝试次数的方式。并且一旦用户输入了错误的密码,也不能直接提示用户输错密码,而应该提示账号或密码错误 token的加密:jwt 举例: 需要一个 secret(随机数) 后端利用 secret 和加密算法(如:HMAC-SHA256)对 payload(如账号密码) 生成一个字符串(token),返回前端 前端每次 request 在 header 中带上 token 后端用同样的算法解密 前端加密虽然前端加密对于安全防护来说意义不大,但是在遇到中间人攻击的情况下,可以避免明文密码被第三方获取 看几种常见的前端字符串加密方法: 1. base64Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。 最初,Base64是为了解决电子邮件中无法直接使用非ASCII字符的问题。一段数据先经过Base64编码为ASCII字符串后,可以在接收端,通过Base64解码还原为原数据后,而无需担心传输过程中失真。 使用示例 window.atob() 与window.btoa()可以实现对base64格式的数据进行解码和编码,其兼容性是主流浏览器,IE10及以上。 window.atob(encodedStr)只可以解码用btoa方法编码的字符串。 window.btoa():将ascii字符串或二进制数据转换成一个base64编码过的字符串,但该方法不能直接作用于Unicode字符串 var str64 = window.btoa("hello"); console.log("字符串是:"+str); console.log("经base64编码后:"+str64); console.log("base64解码后:"+window.atob(str64));准确来说Base64并不是一种加密方式,明文使用Base64编码后的字符串通过索引表可以直接还原为明文。Base64只能作为一种数据的存储格式。 只是很多时候,我们都将Base64编码作为数据加密后的传输 / 存储格式。例如,一段明文数据通过MD5 、SHA等手段加密后,经过Base64编码为字符串,就可以很方便地进行传输 & 存储。 2. MD5加密(不可逆)MD5.js是通过前台js加密的方式对用户信息,密码等私密信息进行加密处理的工具,也可称为插件。 使用 MD5共有6种加密方法: hex_md5(value) b64_md5(value) str_md5(value) hex_hmac_md5(key, data) b64_hmac_md5(key, data) str_hmac_md5(key, data) var code = "123456"; var username = "123456"; var password = "123456"; var str1 = hex_md5("123456"); var str2 = b64_md5("123456"); var str3 = str_md5("123456"); var str4 = hex_hmac_md5(code,code); var str5 = b64_hmac_md5(username,username); var str6 = str_hmac_md5(password,password); console.log(str1); // e10adc3949ba59abbe56e057f20f883e console.log(str2); // 4QrcOUm6Wau+VuBX8g+IPg console.log(str3); // áÜ9IºY«¾VàWò��> console.log(str4); // 30ce71a73bdd908c3955a90e8f7429ef console.log(str5); // MM5xpzvdkIw5VakOj3Qp7w console.log(str6); // 0Îq§;Ý��9U©��t)ï MD5是一种广泛使用的散列算法。 MD5不能算是加密算法,而是一种信息的摘要算法。只是其简单易用,广为流传,被误传为一种加密算法。 MD5是不可逆的,没有解密算法。但是现在有很多暴力破解的方法也可以搭配使用。 3. sha1加密(不可逆)sha1安全散列算法,现在以继称为公认的最安全的散列算法之一,并广泛使用。 sha1的一种数据加密算法,算法思想的接收一段明文,然后以一种不可逆的方式将它转化为(通常更小)的密文,也可以简单的理解为提取一串输入码(称为预映射或信息)。并把它们转为为长度较短、位数固定的输出序列即散序值(也称为信息摘要或信息认证代码)的过程。 var sha1_1 = sha1("mosquito~"); console.log(sha1_1); var sha1_2 = sha1("admin:1001"); console.log(sha1_2); MD5相比与SHA1最显著和最重要的区别是SHA1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA1则是2^160数量级的操作。 这样,SHA1对强行攻击有更大的强度。 相对的在相同的硬件上,SHA1的运行速度比MD5慢。 但是就目前的情况来看,SHA1也很容易被攻破,为了安全起见,可以选择诸如SHA256,SHA512等高强度的算法来提升安全性。 4. AES/DES加密解密自从有了AES后DES就逐渐退出历史舞台了,这里就不多赘述了。 AES(Advanced Encryption Standard),AES加密算法是密码学中的高级加密标准。是一种最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。AES采用对称分组密码体制,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。 import CryptoJS from "crypto-js"; const key = CryptoJS.enc.Utf8.parse("1234567890abc765"); //16位 const iv = CryptoJS.enc.Utf8.parse("1234567890000000"); // AES加密 export function Encrypt(word,keyStr,ivStr){ let key = KEY, iv = IV, srcs, encrypted; if (keyStr) { key = CryptoJS.enc.Utf8.parse(keyStr); iv= CryptoJS.enc.Utf8..encrypt(ivStr); } srcs= CryptoJS.enc.Utf8.parse(word); encrypted= CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.EBC, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.base64.stringify(encrypted.ciphertext); //返回base64格式密文 }, // AES解密 export function Decrypt(word,keyStr,ivStr){ let key = KEY, iv = IV, base64, src, decrypt, decryptedStr; if (keyStr) { key = CryptoJS.enc.Utf8.parse(keyStr); iv= CryptoJS.enc.Utf8..encrypt(ivStr); } base64 = CryptoJS.enc.Base64.parse(word); src = CryptoJS.enc.Base64.stringify(base64); decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); }【注】:加密的时候必须转成字符串 使用toString。 解密的时候 必须使用utf8的格式 使用: import { Encrypt } from "crypto"; let newPassword = Encrypt(password); |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |