談談《Dotnet core結合jquery的前後端加密解密密碼密文傳輸的實現》一文中後端解密失敗的原因

又見阿郎發表於2018-07-16

詳情請看《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傳入公鑰是可行的,前端可以獲取到公鑰進而加密,但是!每次你進入登入註冊頁面,生成的公鑰都是不一樣的,只有在你某次進入的登入註冊頁進行登入註冊,才能解密成功,要不然會因為每次的公鑰不一樣,私鑰也就不一樣,因此就會解密失敗。所以,這點是要注意的。

相關文章