【问题标题】:Best practice for encrypting on the client在客户端加密的最佳实践
【发布时间】:2012-04-28 07:42:04
【问题描述】:

我目前正在使用允许“加密”选项的 Web API。

我可以将我的帐户设置为具有“共享密钥”,并且使用此密钥我应该在提交到服务器之前加密客户端上的所有数据。

来自他们网站的详细信息:

加密算法:DES

区块模式:ECB

填充:PKCS7 或 PKCS5 (它们可以互换)

“共享密钥”在这个意义上我相信是一种对称算法 - 用于解密/加密的相同密钥,尽管我可能在这个上错了。

我想知道在客户端处理这种情况的最佳做法是什么?

如果我的应用程序的逻辑应该使用此密钥来加密数据,那么它对黑客的安全性如何?

请注意,我的应用是用 C# 编写的,这意味着它实际上可以免费反编译。

【问题讨论】:

    标签: c# .net security encryption


    【解决方案1】:

    除非您的密钥被泄露,否则您的数据传输是安全的 - 任何窃听您的客户端-服务器连接的人都无法解密您的数据,除非他们拥有您的密钥。

    您的主要挑战在于在客户端和服务器上本地安全地存储密钥。为此,我建议研究通过 .NET 中的 ProtectedData 类公开的 Windows 数据保护 API (DPAPI)。

    【讨论】:

      【解决方案2】:

      如果shared key 表示public key,那么您很可能正在使用一种称为asymmetric encryption 的算法。由于公钥不能用于解密数据,因此您对黑客来说是安全的。

      如果它是对称的,那么一切都取决于密钥的安全性。您可以将其与程序分开存储(因此用户可以将其安全地存储在闪存驱动器上)。所以每个用户都必须有自己的密钥,不可能对所有人都使用一个对称密钥。

      【讨论】:

      • 更新了我的问题。看来算法是对称的(DES)。
      【解决方案3】:

      这样,客户端将使用不同的密钥对数据进行加密,而服务器将使用不同的密钥进行解密。这称为非对称加密/解密。

      .NET Framework 为非对称加密提供了 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)
      

      【讨论】:

      • 这对给定的问题没有帮助,因为 API 没有使用非对称加密。
      • 在您的情况下,请从服务器数据库中读取共享密钥,然后使用它。这样客户端就没有硬编码的key了,所以如果有人反编译dll就找不到信息了。
      • 授权后,您可以将共享密钥存储在会话中。
      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多