最近公司專案驗收後,客戶請來的資訊保安技術人員對我們的**進行了各種安全測試與排查問題,其中就有乙個登陸時的加密問題。本來如果只是單純的加密,可以直接在前台用md5加密,將加密的值新增到資料庫即可。但是現在的專案裡有很多的使用者,密碼也是後台md5加密了的。這樣就不能單純在前台用md5加密,可能是本人能力有限,使用的前台md5加密與後台的md5加密的值不一致,使用者登陸在密碼比對的時候就會失敗登陸不了。只能使用非對稱加密,前台加密後台解密後使用md5加密再作對比,這種做法才能使用改動最少。網上查資料後就使用了rsa非對稱加密。
前端**
後端**
var publickey = "公鑰可以用工具生成"
var privatekey = "私鑰可以用工具生成「
rsacrypto rsacrypto = new rsacrypto(privatekey, publickey);
userpwd = rsacrypto.decrypt(userpwd); //解密後的密碼,就是輸入密碼的值
///
/// rsa非對稱加密
///
public class rsacrypto
if (!string.isnullorempty(publickey))
}public string decrypt(string ciphertext)
return encoding.utf8.getstring(_privatekeyrsaprovider.decrypt(system.convert.frombase64string(ciphertext), false));
}public string encrypt(string text)
return convert.tobase64string(_publickeyrsaprovider.encrypt(encoding.utf8.getbytes(text), false));
}private rsacryptoserviceprovider creatersaproviderfromprivatekey(string privatekey)
rsa.importparameters(rsaparams);
return rsa;
}private int getintegersize(binaryreader binr)
;count = bitconverter.toint32(modint, 0);
}else
while (binr.readbyte() == 0x00)
binr.basestream.seek(-1, seekorigin.current);
return count;
}private rsacryptoserviceprovider creatersaproviderfrompublickey(string publickeystring)
;byte x509key;
byte seq = new byte[15];
int x509size;
x509key = convert.frombase64string(publickeystring);
x509size = x509key.length;
// --------- set up stream to read the asn.1 encoded subjectpublickeyinfo blob ------
using (memorystream mem = new memorystream(x509key))
else
return null;
byte modint = ; //reverse byte order since asn.1 key uses big endian order
int modsize = bitconverter.toint32(modint, 0);
int firstbyte = binr.peekchar();
if (firstbyte == 0x00)
byte modulus = binr.readbytes(modsize); //read the modulus bytes
if (binr.readbyte() != 0x02) //expect an integer for the exponent data
return null;
int expbytes = (int)binr.readbyte(); // should only need one byte for actual exponent data (for all useful values)
byte exponent = binr.readbytes(expbytes);
// ------- create rsacryptoserviceprovider instance and initialize with public key -----
rsacryptoserviceprovider rsa = new rsacryptoserviceprovider();
rsaparameters rsakeyinfo = new rsaparameters();
rsakeyinfo.modulus = modulus;
rsakeyinfo.exponent = exponent;
rsa.importparameters(rsakeyinfo);
return rsa;}}
}private bool comparebytearrays(byte a, byte b)
return true;}}
rsa金鑰對生成工具---------
請選用pkcs#1來生成公鑰與私鑰
RSA加密與解密講解
這裡只是講講rsa rsars a是怎麼加密以及怎麼解密。採用r sa rsars a的方法後可以得到乙個公鑰 n,e n,e n,e 和私鑰 n,d n,d n,d 對於乙個明文a aa,我們把它加密得到b bb,b a emod nb a e mod n b aemo dn。我們把b bb,發給...
RSA加密解密
擷取自我的部落格 因為專案需要,最近做乙個rsa加密解密的介面,使用go進行開發,介面使用jsonrpc,go 對rsa加密解密有很好的支援,不過由於受限於底層微控制器,所以上層應用需要做一些稍微的調整。rsa是一種非對稱加密演算法,什麼是非對稱加密演算法呢,那就是公鑰 私鑰可互相進行加密解密 公鑰...
RSA加密解密
rsa加密使用公鑰加密,使用私鑰解密,rsa可以自己隨機生成一組公鑰和私鑰 rsa隨機生成一組公鑰和秘鑰 隨機生成公鑰和秘鑰 沒建立乙個rsacryptoserviceprovider物件,能生成一組隨機的秘鑰,物件相同不管執行多少次方法都是生成的同一組秘鑰 公鑰 私鑰 public static ...