最近项目检测出漏洞,说是登录时,用户名密码都是明文,导致系统不安全,容易被抓包,截取到用户名跟密码。
这也算是漏洞之一吧,为此,就要想个最小改动方法来修复漏洞,因为选用了AES加密这个方法。
AES(高级加密标准)是一种对称密钥加密算法,广泛用于保护数据的机密性。它采用相同的密钥用于加密和解密数据,因此也被称为对称加密算法。
要使用AES加密数据,首先需要选择一个密钥,并将明文数据与该密钥一起传递给AES加密算法。AES支持不同的密钥长度,包括128位、192位和256位。通常来说,密钥越长,加密的安全性越高,但也会增加计算成本。
了解过概念后,我们接下来看下这个加密的例子
前端js 密钥可以自己定
function Encryption(number) {
//console.log(number);
var key = CryptoJS.enc.Utf8.parse('密钥');
var iv = CryptoJS.enc.Utf8.parse('密钥值');
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(number), key,
{
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
调用,当用户名光标消失时,就进行用户名加密
$('#txtUserName').blur(function () {
var username = $("#txtUserName").val();
if (username != "") {
var username_encrypt = Encryption(username);
$("#txtUserName").val(username_encrypt);
}
})
加密用到的关键js类库,在以下链接中
<script src="login/scripts/crypto-js.min.js"></script>
链接:https://pan.baidu.com/s/197D-NACvnpFkUZCciw94rg?pwd=oxfo
提取码:oxfo
接下来,我们看下后台解密的
public string DecryptStringAES(string encryptedValue)
{
var keybytes = Encoding.UTF8.GetBytes(strkey);
var iv = Encoding.UTF8.GetBytes(strvalue);
//DECRYPT FROM CRIPTOJS
var encrypted = Convert.FromBase64String(encryptedValue);
var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv);
return decriptedFromJavascript;
}
private static string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
{
throw new ArgumentNullException("cipherText");
}
if (key == null || key.Length <= 0)
{
throw new ArgumentNullException("key");
}
if (iv == null || iv.Length <= 0)
{
throw new ArgumentNullException("key");
}
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (var rijAlg = new RijndaelManaged())
{
//Settings
rijAlg.Mode = CipherMode.CBC;
rijAlg.Padding = PaddingMode.PKCS7;
rijAlg.FeedbackSize = 128;
rijAlg.Key = key;
rijAlg.IV = iv;
// Create a decrytor to perform the stream transform.
var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for decryption.
using (var msDecrypt = new MemoryStream(cipherText))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
c#里边要注意引用
using System.Security.Cryptography;
以上就是实现代码,接下来我们来讲下实现想法跟思路。有的人可能会问,为什么不用md5这种不可逆的加密方法。
那是因为系统中的代码并没有实现MD5加密,假如用MD5加密,那也就意味着,要将数据库的明文密码修改为MD5加密。
这无形中就增加了我们的开发成本,所以没有必要。
以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。
要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。
共有 0 条评论