ColdFusion – cfusion_encrypt()和cfusion_decrypt() – C#替代方案

我有一个数据库,其中包含通过cfusion_encrypt()加密的用户密码。 我需要在C#中为ColdFusion代码做一个登录替代。 有没有简单的方法如何在C#中模拟这个,这样我就可以比较用户密码的加密值并将它们与ColdFusion值匹配?

命名不佳的cfusion_encrypt()根本不是加密 。 它是一种内部的遗留混淆算法,强烈建议不要使用它。

本质上它只是xor的字节,类似于这里描述的方法 (忽略提到cfmx_compat ,这是一个不同的遗留算法)。 它提取纯文本字符串的字节。 然后将提供的key字符串填充到相同的长度 ,并再次提取字节。 最后,xor是两个字节数组,并将结果编码为hex:

  // xor bytes byte[] result = new byte[textBytes.Length]; for (int i = 0; i < textBytes.Length; i++) { results[i] = (byte)(textBytes[i] ^ keyBytes [i]); } // encode result as hex String hexResult = BitConverter.ToString(results).Replace("-", ""); 

cfusion_decrypt()函数基本上只是将hex字符串首先解码为字节,并将“去混淆”结果作为纯字符串而不是hex返回。

现在你可以看到为什么不鼓励使用它。 正如@MartyPine和其他人所建议的那样,更好的选择是让CF端进行备份,然后通过cfusion_decrypt和hash()来运行密码。 它不仅是存储密码的更好方式,还具有与C#或支持标准算法的任何其他语言兼容的优点。

这可能无法解答您的问题,但我能说的最好的选择是将Coldfusion循环编码为:

  1. cfusion_decrypt()密码
  2. 以C#友好格式散列密码

我不知道cfusion_decrypt和cfusion_encrypt的任何C#本机等价物,但希望这里的人们可以指向你。

如果你需要Adobe在ColdFusion 11中默默弃用的内置“cfusion_encrypt”和“cfusion_decrypt”未记录的函数,开发人员在2005年将它们转换为UDF。

http://www.barneyb.com/barneyblog/2005/10/28/cfusion_encryptcfusion_decrypt-udfs/

  function binaryXOR(n1, n2){ n1 = formatBaseN(n1, 2); n2 = formatBaseN(n2, 2); return inputBaseN(replace(n1 + n2, 2, 0, "all"), 2); } function fusion_encrypt(string, key){ var i = ""; var result = ""; key = repeatString(key, ceiling(len(string) / len(key))); for (i=1;i LTE len(string);i=i+1) { result = result & rJustify(formatBaseN(binaryXOR(asc(mid(string, i, 1)), asc(mid(key, i, 1))), 16), 2); } return ucase(replace(result, " ", "0", "all")); } function fusion_decrypt(string, key){ var i = ""; var result = ""; key = repeatString(key, ceiling(len(string) / 2 / len(key))); for (i=2;i LTE len(string);i=i+2) { result = result & chr(binaryXOR(inputBaseN(mid(string, i - 1, 2), 16), asc(mid(key, i / 2, 1)))); } return result; }  

这是关于如何测试它的示例脚本:

    
String cfusion_encrypt fusion_encrypt cfusion_decrypt fusion_decrypt
#i# #cfusion_encrypt(i, key)#ERROR #fusion_encrypt(i, key)#ERROR #cfusion_decrypt(cfusion_encrypt(i, key), key)#ERROR #fusion_decrypt(fusion_encrypt(i, key), key)#ERROR

可能最简单的解决方案是创建将与您的数据库交互的ColdFusion服务层,但是您需要处理此服务的安全性,当然如果您想要保持密码的方式。

如果您不想要CF服务层,那么您需要做的是弄清楚正在使用哪种加密方式。 如果它是常见的哈希算法之一,如:MD5 SHA1 SHA256 SHA384 SHA512,那么你将有机会解决这个问题。

我在www.fusionauthority.com上发现了一篇旧文章,其中说:

CFusion_Encrypt()/ CFusion_Decrypt()在ColdFusion中是“管理”的,除此处以外的任何地方都没有记录。 Allaire不建议使用它们,并且不支持它们的使用。