C#和PHP,ColdFusion,Ruby,Python之间的兼容加密
我们正在开发一种服务,该服务将接受" POST"请求。一些POST
数据将需要在POST
之前进行加密,因为它们将存储在表单的隐藏字段中。
该应用程序是用C#编写的,但是我们希望第三方客户端能够轻松地与其集成。我们发现大多数客户使用PHP,Classic ASP或者VB.Net。
第三方应仅进行加密。我们将进行解密。没有双向通讯。
加密算法,填充模式和其他选项最兼容的组合是什么?
解决方案
听起来像RSA是适合算法。
我将使用AES进行批量数据加密,并使用RSA加密AES密钥。
如果数据足够小,则只需使用RSA加密整个内容即可。
假设我们拥有共享密钥的安全方法(无论是RSA加密,通过SSH或者HTTPS链接进行检索,还是在安全的电话线路上呼叫其他开发人员),那么任何主要的现代加密技术(例如AES,如上所述)由@Ed Haber撰写)将是合适的。我赞同他对AES的建议。应该有用于PHP,VB,Ruby等的库。
但是,请记住,在没有"双向通信"的情况下,我们将必须找到一种通道外方法来安全地将对称密钥获取给加密方。
如果我们表示第三方应该不可能解密数据,那么我们将要使用非对称加密算法,例如RSA。这将使第三方使用公钥加密数据,然后只有我们可以使用私钥(不公开)解密数据。应该为我们提到的所有语言提供RSA的实现。
如果我们不在乎第三方是否可以解密数据,那么AES是理想之选。我们将拥有一个与第三方共享的密钥。该密钥用于加密和解密。
我们可以非常轻松地实现自己的基于XOR密钥的位加密。稍加思考和独创性,我们就可以提出比应用程序更合适的东西。
这是一个PHP示例:
function XOREncryption($InputString, $KeyPhrase){ $KeyPhraseLength = strlen($KeyPhrase); for ($i = 0; $i < strlen($InputString); $i++){ $rPos = $i % $KeyPhraseLength; $r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]); $InputString[$i] = chr($r); } return $InputString; }
ColdFusion具有加密和解密功能,能够处理多种算法和编码,包括上面建议的AES。
有关信息,请访问:http://www.cfquickdocs.com/cf8/?getDoc=encrypt#Encrypt
快速示例代码:
Key = generateSecretKey( 'AES' , 128 ) EncryptedText = encrypt( Text , Key , 'AES' , 'Hex' ) Text = decrypt( EncryptedText , Key, 'AES' , 'Hex' )
该库可为PHP提供类似的功能:
http://www.chilkatsoft.com/p/php_aes.asp
...以及Java,Python,Ruby和其他...
http://www.example-code.com/java/crypt2_aes_matchPhp.asp
http://www.example-code.com/python/aes_stringEncryption.asp
埃德·哈伯(Ed Haber)说
I would use AES for the bulk data encryption and RSA for encrypting the AES Key. If the data is small enough then just encrypt the whole thing with RSA.
我认为这是一个很好的解决方案。我要做的是让应用程序发布一个API以获取公共RSA密钥。当我的第三方想向我们发送某些内容时,它将获得公钥。然后,它会生成一个会话密钥,以使用分组密码(即AES)进行实际的加密,并通过使用公共密钥进行加密将其发送给我们。我们用私钥解密会话密钥。然后,第三方使用AES(使用我们也发布的填充方案)加密要发送给数据,并将其发送给我们。我们可以使用会话密钥对其进行解密。
上面的方法存在一些问题。由于我们没有发送任何信息(除了发布公共密钥之外,我们无法控制会话密钥的生成方式。这意味着第三方可以使用非常不安全的方式生成会话密钥,我们将永远不会知道。第二个问题是每个想要向我们发送数据的人都必须以与我们相同的方式为AES填充数据。因此,我们必须确保每个坐标都是如此。特别是如果我们不太信任第三方,无法从良好的加密安全随机数生成器生成真正良好的会话密钥
为什么不通过HTTPS公开服务器?这样,任何可以处理HTTPS的客户端都可以安全地使用该服务。