RSA在.NET Core的改動
以前我們使用RSA加密主要是使用RSACryptoServiceProvider
這個類,在.NET Core中也有這個類,但是這個類並不支持跨平台,所以如果你是用這個類來進行加/解密在windows上運行是完全沒有錯誤的,但是只要你一放到Linux下就會出現異常。
查閱資料得知,要解決這個問題,需要改用 System.Security.Cryptography.RSA.Create()
工廠方法,使用它之后,在 Windows 上創建的是 System.Security.Cryptography.RSACng
的實例,在 Mac 與 Linux 上創建的是 System.Security.Cryptography.RSAOpenSsl
的實例,它們都繼承自 System.Security.Cryptography.RSA
抽象類。
這里要講一下RSA2算法。
什么是RSA2 ?RSA2 是在原來SHA1WithRSA簽名算法的基礎上,新增了支持SHA256WithRSA的簽名算法。該算法比SHA1WithRSA有更強的安全能力。
算法名稱 | 標准簽名算法名稱 | 備注 |
---|---|---|
RSA2 | SHA256WithRSA | (強烈推薦使用),強制要求RSA密鑰的長度至少為2048 |
RSA | SHA1WithRSA | 對RSA密鑰的長度不限制,推薦使用2048位以上 |
簽名的作用:保證數據完整性,機密性和發送方角色的不可抵賴性
看下代碼:
/// <summary> /// 獲取證書私鑰並簽名 /// </summary> /// <param name="priKeyFile">私鑰證書</param> /// <param name="keyPwd">私鑰密碼</param> /// <param name="data">簽名內容</param> /// <returns></returns> private static string PrivateSign(string priKeyFile, string keyPwd, string data) { var pc = new X509Certificate2(priKeyFile, keyPwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet); var data_byte = Encoding.UTF8.GetBytes(data); var result_byte = pc.GetRSAPrivateKey().SignData(data_byte, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); var strResult = Convert.ToBase64String(result_byte); return strResult; }
HashAlgorithmName.SHA256 //獲取表示“SHA256”的哈希算法名稱。
RSASignaturePadding.Pkcs1 //獲取使用 PKCS #1 v1.5 填充模式的對象。