Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Net中(对称)加密的最佳实践?_C#_.net_Encryption_Encryption Symmetric_Pci Compliance - Fatal编程技术网

C# Net中(对称)加密的最佳实践?

C# Net中(对称)加密的最佳实践?,c#,.net,encryption,encryption-symmetric,pci-compliance,C#,.net,Encryption,Encryption Symmetric,Pci Compliance,加密SQL数据库中某些敏感或个人识别数据的“最佳实践”是什么(根据PCI、HIPAA或其他适用的法规遵从性标准) 这里有许多关于解决方案的各个方面的问题,但我没有看到在高层次上讨论该方法的任何问题。 环顾四周一段时间后,我得出以下结论: 使用CryptoAPI和Rijndael 生成IV并将其与加密数据一起存储 使用DPAPI(机器范围)来“保护”对称密钥 将对称密钥存储在注册表、文件或数据库中,拆分密钥并将部分存储在多个位置以增加保护 除非确实需要,否则不要解密数据,即从数据库读取时不解密。

加密SQL数据库中某些敏感或个人识别数据的“最佳实践”是什么(根据PCI、HIPAA或其他适用的法规遵从性标准)

这里有许多关于解决方案的各个方面的问题,但我没有看到在高层次上讨论该方法的任何问题。 环顾四周一段时间后,我得出以下结论:

  • 使用CryptoAPI和Rijndael
  • 生成IV并将其与加密数据一起存储
  • 使用DPAPI(机器范围)来“保护”对称密钥
  • 将对称密钥存储在注册表、文件或数据库中,拆分密钥并将部分存储在多个位置以增加保护
  • 除非确实需要,否则不要解密数据,即从数据库读取时不解密。相反,将密码文本保存在内存中

这是否足够?过时的?审计安全?鲁莽?

您的方法很好,在我看来有一些调整(我通常为PCI合规性编写代码):

使用CryptoAPI和Rijndael

不管其他API如何,至少使用Rijndael/AES256

生成IV并将其与加密数据一起存储

使用DPAPI(机器范围)来“保护”对称密钥

不知道这是否重要。我会把IV放在加密的数据旁边,或者如果你真的对其他媒体有妄想症的话。确保公众无法使用IV

将对称密钥存储在注册表、文件或数据库中,拆分密钥并将部分存储在多个位置以增加保护

如果有人偷了你的媒体,在多个地方存储对你没有帮助。在heck上拆分密钥有点过分,但绝对不要将其与您的IV和/或密文一起存储。那太糟糕了

除非确实需要,否则不要解密数据,即从数据库读取时不解密。相反,将密码文本保存在内存中

当然。在内存中妥善保存密码文本,但不要在任何地方传递密码文本,除非绝对必须解密,否则不要解密,即使这样,也不要公开整个未加密的数据集—至少只公开需要的数据集。此外,如果可能的话,不要将钥匙保存在内存中-内存转储可能会将其暴露

新增内容:

  • 无论在哪个数据库中存储密码文本,都应将读取权限完全限制在为给定标识符选择的进程上。不允许任何人(甚至SA帐户)读取存储此数据的表。这样,闯入您的系统的人将很难在不知道要查找什么ID的情况下读取您的密码文本。对任何引用密文表上标识符的表执行相同操作不允许对这些表进行全面读取
  • 通过IP限制数据库访问
  • 决不要在状态上在内存中保留任何未加密的明文。允许在请求完成后立即取消引用/垃圾收集
  • 将运行此代码的服务器限制为尽可能少的用户
  • 可能结合加密方法以获得更强的密文(例如AES+河豚)

希望这些帮助。其中一些是我个人的意见,但据我所知,仍然符合PCI。

我看到前面的一条评论提到,使用CryptoAPI并不重要。我只想指出CryptoAPI是FIPS 140-2兼容的,而Bouncy Castle和内置的托管类(所有在System.Security.Cryptography命名空间中名称末尾带有“managed”的类)则不是。如果您对FIPS合规性有要求,那么使用CryptoAPI可能是最容易的

我想补充:

  • 隐藏静脉注射并不重要。如果静脉注射是公开的就可以了。只要使用好的IVs,也就是说,使用一个加密的强随机数生成器,这样你的IVs就无法与随机数区分开来

  • 将加密密钥与其加密的数据分开存储

  • 将身份验证添加到加密中。例如,添加第二个对称加密密钥加密的HMAC,覆盖密文。如果您不使用某种形式的经过身份验证的加密,那么您的密文可能会被修改,并且您无法知道(AES会很好地解密垃圾)。您希望注意对密文的任何篡改


    • 从OWASP()中获取了更多通用的最佳实践列表:

      • 使用强批准的加密算法
        • 不要自己实现现有的加密算法
        • 仅使用经批准的公开算法,如AES、RSA公钥加密和SHA-256或更好的哈希算法
        • 不要使用弱算法,如MD5或SHA1
        • 避免对密码存储进行哈希,而是使用Argon2、PBKDF2、bcrypt或scrypt
      • 使用批准的加密模式
        • 通常,不应直接使用AES、DES或其他对称密码原语。应改用经批准的模式。引用Nist的话:“经批准的加密/解密算法是对称密钥算法:AES和TDEA。”
      • 使用强随机数
      • 确保保护所有密钥,防止未经授权的访问

      此外,根据这一点:

      • 要避免DES,RSA-768,-1024也是如此
      • 可接受RSA-2048和RSA-3072
      • AES-CBC模式是可接受的,而
      • AES-GCM模式是下一代加密的一部分

      从安全角度来看,我认为使用CryptoAPI并不重要——只要使用Rijndael或AES(目前)。例如,您可以使用bouncy castle来实现这一点。独立于加密数据存储IV似乎更安全。在不同的硬件上存储对称密钥——这更安全——总是一种更好的做法