2012-04-28 170 views
0

我目前正在使用允許「加密」選項的Web API。客戶端加密的最佳實踐

我可以設置我的帳戶有一個「共享密鑰」,並且使用此密鑰我應該在提交給服務器之前加密客戶端上的所有數據。從他們的網站

詳情:

加密算法:DES

塊模式:ECB

填充:PKCS7或PKCS5 (它們是可以互換)

「共享關鍵「在這個意思我認爲是一個對稱算法 - 相同的密鑰用於解密/加密,雖然我可能是wr在這一個上。

我想知道在客戶端處理這種情況的最佳做法是什麼?

如果我的應用程序的邏輯應該使用此密鑰來加密數據,那麼它對黑客的安全性如何?

請注意,我的應用程序是用C#編寫的,這意味着它可以實際上免費反編譯。

回答

0

如果shared key表示public key那麼您很可能使用了一種算法asymmetric encryption。這樣你就可以安全地使用黑客,因爲公鑰不能用來解密數據。

如果它是對稱的,那麼所有取決於安全密鑰的安全性。您可以將其與程序分開存儲(因此用戶可以將其安全地存儲在閃存驅動器中)。因此,每個用戶必須擁有自己的密鑰,所有人都無法使用一個對稱密鑰。

+0

更新了我的問題。看來該算法是對稱(DES)。 – 2012-04-28 08:49:45

+0

@liortal我已更新了答案。 – 2012-04-28 09:25:58

1

除非您的密鑰被泄露,否則您的數據傳輸是安全的 - 任何人竊聽您的客戶端 - 服務器連接都將無法解密您的數據,除非他們有您的密鑰。

您的主要挑戰在於密鑰在客戶端和服務器上的本地安全存儲。爲此,我建議查看通過.NET中的ProtectedData類公開的Windows Data Protection API(DPAPI)。

0

以這種方式,客戶端將用不同的密鑰加密數據,服務器將用不同的密鑰解密。這稱爲非對稱加密/解密。

.NET框架爲非對稱加密提供RSACryptoServiceProvider和DSACryptoServiceProvider類。當您使用默認構造函數創建新實例時,這些類會創建公鑰/私鑰對。非對稱密鑰既可以存儲在多個會話中使用,也可以僅爲一個會話生成。儘管公鑰一般都可以使用,但私鑰應該受到嚴密保護。

For example [VB.NET]: 

Dim cspParam as CspParameters = new CspParameters() 
cspParam.Flags = CspProviderFlags.UseMachineKeyStore 
Dim RSA As System.Security.Cryptography.RSACryptoServiceProvider 
      = New System.Security.Cryptography.RSACryptoServiceProvider(cspParam) 

The key information from the cspParam object above can be saved via: 

Dim publicKey as String = RSA.ToXmlString(False) ' gets the public key 
Dim privateKey as String = RSA.ToXmlString(True) ' gets the private key 

The above methods enable you to convert the public and/or private keys to Xml Strings. 
And of course, as you would guess, there is a corresponding FromXmlString method to get them back. 
So to encrypt some data with the Public key. The no-parameter constructor is used as we are loading our keys from XML and 
do not need to create a new cspParams object: 

Dim str as String = "HelloThere" 
Dim RSA2 As RSACryptoServiceProvider = New RSACryptoServiceProvider() 
' ---Load the private key--- 
RSA2.FromXmlString(privateKey) 
Dim EncryptedStrAsByt() As Byte =RSA2.Encrypt(System.Text.Encoding.Unicode.GetBytes(str),False) 
Dim EncryptedStrAsString = System.Text.Encoding.Unicode.GetString(EncryptedStrAsByt) 

and as a "proof of concept", to DECRYPT the same data, but now using the Public key: 

Dim RSA3 As RSACryptoServiceProvider = New RSACryptoServiceProvider(cspParam) 
'---Load the Public key--- 
RSA3.FromXmlString(publicKey) 
Dim DecryptedStrAsByt() As Byte =RSA3.Decrypt(System.Text.Encoding.Unicode.GetBytes(EncryptedStrAsString), False) 
Dim DecryptedStrAsString = System.Text.Encoding.Unicode.GetString(DecryptedStrAsByt) 
+0

這對於給定的問題沒有幫助,因爲API不使用不對稱加密。 – 2012-04-28 11:26:10

+0

對於您的情況,請從服務器數據庫讀取共享密鑰,然後使用它。以這種方式,客戶端將不會有硬編碼密鑰,所以如果有人反編譯該DLL,則不會找到任何信息。 – 2012-04-28 11:31:10

+0

授權後,您可以將共享密鑰存儲在會話中。 – 2012-04-29 09:05:24

相關問題