詳情請看《Dotnet core結合jquery的前後端加密解密密碼密文傳輸的實現》,正常來講,這個部落格裡面的程式碼是沒有問題的,但是我有時候卻會直接報錯,原因是後臺解密失敗:Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException
我一開始想,是不是因為前端jquery傳過來的祕鑰裡面有了空格,於是加了trim,但有時候還是不行,繼續分析。我發現,解密失敗只會出現在我用VS生成了專案之後(預設頁面是登入頁面),沒有立即登入,然後我又重新生成了專案,此時開了除錯模式,然後我再之前的頁面進行登入就會報錯。我後來一想是不是跟祕鑰有關?看了下程式碼,一分析還真是:
public class ProcessViewResultAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { //rsa public key var controller = (context.Controller as Controller); controller.ViewBag.PublicExponent = RSAUtil.PublicPars.PublicExponent; controller.ViewBag.PublicModulus = RSAUtil.PublicPars.PublicModulus; base.OnResultExecuting(context); } }
ActionFilterAttribute裡面所有的過濾器方法都是在前端razor頁面出現之前執行完成的,因此,在OnResultExecuting中給ViewBag傳入公鑰是可行的,前端可以獲取到公鑰進而加密,但是!每次你進入登入註冊頁面,生成的公鑰都是不一樣的,只有在你某次進入的登入註冊頁進行登入註冊,才能解密成功,要不然會因為每次的公鑰不一樣,私鑰也就不一樣,因此就會解密失敗。所以,這點是要注意的。