我有一个数据库,其中包含通过cfusion_encrypt()加密的用户密码.我需要为C#中的ColdFusion代码做一个登录替代.有没有简单的方法如何在C#中模拟这个,这样我就可以比较用户密码的加密值并将它们与ColdFusion值匹配?
名字不好cfusion_encrypt()
根本就不是加密.它是一种内部的遗留混淆算法,强烈建议不要使用它.
本质上它只是xor的字节,类似于这里描述的方法(忽略提及cfmx_compat
,这是一个不同的遗留算法).它提取纯文本字符串的字节.然后将提供的key
字符串填充到相同的长度,并再次提取字节.最后,xor是两个字节数组,并将结果编码为十六进制:
// 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()
函数基本上只是将十六进制字符串首先解码为字节,然后将"去混淆"结果作为普通字符串而不是十六进制返回.
现在你可以看到为什么不鼓励使用它.正如@MartyPine和其他人所建议的那样,更好的选择是让CF端进行备份,然后运行密码cfusion_decrypt
并使用hash()代替它们.它不仅是存储密码的更好方式,还具有与C#或支持标准算法的任何其他语言兼容的优点.