簡體   English   中英

如何使用公共 RSA 密鑰加密數據? 並用私鑰解密?

[英]How to encrypt data using a public RSA key? And decrypt with the private key?

對於我正在做的一個項目,我想出了這個 static class:

public static class Security
{
    public static RSACryptoServiceProvider RSA { get; } = new(4096);

    public static string EncryptRSA(this string text)
    {
        try { return Convert.ToBase64String(RSA.Encrypt(Encoding.UTF8.GetBytes(text), true)); }
        finally { RSA.PersistKeyInCsp = false; }
    }

    public static string DecryptRSA(this string text)
    {
        try { return Encoding.UTF8.GetString(RSA.Decrypt(Convert.FromBase64String(text), true)); }
        finally { RSA.PersistKeyInCsp = false; }
    }

    public static string Sign(this string text)
    {
        var cr = Credentials();
        var signer = cr.CryptoProviderFactory.CreateForSigning(cr.Key, cr.Algorithm);
        return Convert.ToBase64String(signer.Sign(Encoding.UTF8.GetBytes(text)));
    }

    public static bool Validate(this string text, string signature)
    {
        var cr = Credentials();
        var validator = cr.CryptoProviderFactory.CreateForVerifying(cr.Key, cr.Algorithm);
        return validator.Verify(Encoding.UTF8.GetBytes(text), Convert.FromBase64String(signature));
    }

    public static SigningCredentials Credentials()
    {
        return new SigningCredentials(new RsaSecurityKey(RSA), SecurityAlgorithms.RsaSha512)
        {
            CryptoProviderFactory = new CryptoProviderFactory { CacheSignatureProviders = false }
        };
    }    
}

在我的應用程序開始時,我像這樣導入私鑰:

Security.RSA.FromXmlString(context.Value("PrivateKey"));

它運行良好,因為加密/解密方法會將純字符串轉換為非常長的加密、base54 編碼的值。 Credentials 方法適用於需要對消息進行簽名的代碼的第二部分。 但它只是不能讓我完全了解正在發生的事情。
據我所知,加密使用私鑰,您需要公鑰來解密它。 這允許服務器與多個客戶端共享數據,告訴每個客戶端數據沒有被篡改。 但是,如果我想使用公鑰加密客戶端中的數據並將其發送到服務器,因為它將是唯一可以解密它的人。 我該怎么做?
或者我什至不應該嘗試這個?


另一個煩人的部分是我使用 RSA 加密 email 地址,因為數據庫不允許將它們存儲為純文本,但加密字符串的長度是無數個字符。 (好吧,base64 編碼后將近 700 個。)是否可以減小該大小? 哦,好吧......這不是問題,所以忽略這個問題。


解釋此設置的原因:加密用於通過文件系統共享的少量數據。 服務器在共享輸入文件夾中踢出一堆 XML 文件,其中一些字段已加密。 客戶拿起它們,做一些事情,在共享的 output 文件夾中寫入一個新文件,並將原始文件移動到存檔文件夾中。 隨后,服務器查看output文件夾,將所有文件通過FTP上傳到一台20+年的大型主機。
是的,這很慢。 但這沒問題......僅供參考,該項目必須加密數據並簽署完整的文件。 XML 中的敏感數據已加密,整個 XML 已簽名。 客戶端和服務器都需要能夠對數據進行簽名和加密。 選擇 RSA 是因為它可以兩者兼得。

據我所知,加密使用私鑰,您需要公鑰來解密它。 這允許服務器與多個客戶端共享數據,告訴每個客戶端數據沒有被篡改。 但是,如果我想使用公鑰加密客戶端中的數據並將其發送到服務器,因為它將是唯一可以解密它的人。 我該怎么做? 或者我什至不應該嘗試這個?

第一個假設很好,無論如何,通常如果你想確保你的數據沒有被修改,就是從數據中生成 HASH 然后使用私鑰對其進行加密。 結果稱為簽名。

我不知道您想要實現什么,但是如果您想保護客戶端/服務器之間的通信 - TLS 就是您所需要的(您只需要使用 https)。

RSA 很少用於加密大量數據——它的性能很重,而且它產生更多的數據(如您所見)。 為了保護您的數據,您應該使用一種對稱加密方法(但前提是您不需要非對稱加密方法附帶的所有商品)。

為了減少存儲在 DB 中的長度,您唯一能做的就是將 RSA 密鑰更改為更短的密鑰。 或壓縮數據。 無論如何,正如我之前所說,對於這樣的功能孩子,最好使用對稱加密方法。 如果您想加密數據庫中的某些列,請檢查它的嵌入式功能。 MSSQL 和 postgresql 提供了開箱即用的此類功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM