加密算法有很多,如不可逆的摘要算法MD5、SHA(安全哈希算法),可逆的Base64编码,对称加密算法DES、AES,还有非对称加密算法DH、RSA等。那是不是说明我们可以使用任何一种加密算法就能保证网站的安全性,答案是否。举个例子,我们在登录web页面时,发送用户名和密码给服务器,这时请求被拦截了:
(1) 密码采用不可逆加密。因为不可逆加密算法就那几种,不管怎样变换,攻击者都可以模拟登录;
(2) 密码采用可逆加密算法。因为加密是在前端进行加密,所以可能通过js代码看到加密方式,这样也就很容易破解了。
所以针对浏览器-服务器这种模式,最好采用非对称加密算法,即使攻击者知道了加密算法和公钥,他也没法解密,因为用公钥加密的数据只能用私钥才能解密,而且私钥始终保存在服务器,攻击者无法获取。
md5 加密
md5 加密是一种广泛使用的密码散列函数,可以产生出一个128位散列值,用于确保信息传输完整一致。MD5算法的缺点是容易破解,不适用于安全性认证,常用于密码管理、垃圾邮件筛选、SSL的公开密钥认证或数字证书等。不需要解密。
MD5.js 共有6中加密方法:hex_md5(s), b64_md5(s), str_md5(s), hex_hmac_md5(key,data), b64_hmac_md5(key, data), str_hmac_md5(key, data)
使用方法:
<script src="js/md5.js" type="text/javascript"></script>
var pwd = hex_md5("Victor");
console.log(pwd);
base64加密
base64加密是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!还可以应用于传输二进制数据,如邮件主题及图片等、加密url、加密cookie等。
需要解密使用。
使用方法:
<script src="js/base64.js"></script>
var str = b.encode("admin:admin"); //加密
var str1 = b.decode(str); //解密
console.log(str);
console.log(str1);
SHA-1 加密
SHA-1又叫安全哈希加密bai技du术,是当今世界最先近的加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段密文。主要用于文件身份识别、数字签名和口令加密等。
SHA-1 与 MD5 的比较
- 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
- 速度:在相同的硬件上,SHA-1 的运行速度比 MD5 慢。
使用方法:
<script src="js/sha1.js"></script>
var sha = hex_sha1('mima123465');
console.log(sha);
RSA加密
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。普遍认为是目前最优秀的公钥方案之一。
RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了国家安全管理(NSA)外的其他事物的危害;1024位的密钥几乎是安全的。RSA在一些主要产品内部都有嵌入,像 Windows、网景 Navigator、 Quicken和 Lotus Notes。
效率低,数据量小,适合加密核心数据,配合其他加密使用。
原理:
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
使用方法:
<script src="js/jsencrypt.js"></script>
var str = "密码";
// 公钥
var publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfp4T5UK76SfSvn1wr4+PyStkHWONLVITZp5JLkFkHpiERchwShET+WVlLsbbgyt7Yt/boMoxr+XTD2NXd1gPvq11OU3dNYLE5hL2j8BCBw8EswkCbP+GgYdGF3FRw4eGURA4fcSO44IKuWtmtSyw7y1OMqzMUb6PROXrMFbrntQIDAQAB";
// 私钥
var privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJ+nhPlQrvpJ9K+fXCvj4/JK2QdY40tUhNmnkkuQWQemIRFyHBKERP5ZWUuxtuDK3ti39ugyjGv5dMPY1d3WA++rXU5Td01gsTmEvaPwEIHDwSzCQJs/4aBh0YXcVHDh4ZREDh9xI7jggq5a2a1LLDvLU4yrMxRvo9E5eswVuue1AgMBAAECgYBBGEtmX9hIIplKdf5dwtgw9QWSMlLSZw6Xs/Q5LQyvyrOW6mC5yAZdck6vRzFabDz6Pd/FAr8wUxChvapNfbIyhCsyAuqjVWV/aGDhaauQvwm3MrZ33jnMxI1z9UXPHTzWrYOltv/cKVqvDTKzEokDoTzEVLQClaYcEVMwhRrpYQJBANR48h9o1s7y0sAOoVBo5ktGZhb6gHtwNJ4Yw7Aey2bAWjgU4PevUq985+jBWhdAj81dZ0lMwARBIcYzyo0RLMkCQQDAXIup+fViw0BD+gl36kOo5RkTgz3aoALJsDBLGWi2J9QY9i0UZO9LsjNlYlTldKRzJWkhjdAdxuZe+8Mr8tWNAkB39HB92yqrW9wwIhJg21hpVy17+6FeD1MljsWsQTaEpERLNT5tl8YO3W3wsniyd/i38OvHLlWaEUuIIuVQD0pBAkAFXk/ThZNQl0xi2UaMXzBWNVaW0dHXGSIayN0AK4xdkQz9SVmGuS5oeWevy6e84513TTL66b9GJXfmbLZMsrE9AkAXuppwZW4I/xWZ2RaIsKqyyYYJUPbZ9HT3iO6FSUVPskzaOIPgU9sir+UcvJfWgXDWQ2F/4uUogB2ZS45YcFM8";
// 加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encryptStr = encrypt.encrypt(str);
console.log("加密后:" + encryptStr);
// 解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey);
var decryptStr = decrypt.decrypt(encryptStr);
console.log( "解密后:" + decryptStr);