WordPress HashPassword迁移C#时如何用Convert.ToBase64String替代自定义Encode64
问题根因
- 字符集规则不同:标准Base64的字符索引顺序是
A-Z、a-z、0-9、+、/,而WordPress自定义Encode64的字符集顺序是.、/、0-9、A-Z、a-z,二者字符索引完全不匹配。 - 比特分组逻辑不同:标准Base64处理3字节时按大端顺序取6位组,而WordPress的Encode64是按小端逻辑拼接字节后取6位组,输出的6位序列顺序完全相反。
- 填充规则不同:标准Base64会用
=补齐输出长度为4的倍数,而WordPress的Encode64没有填充逻辑,16字节输入下自定义实现输出22个字符,标准Base64输出带2个=的24字符,所以长度不一致。
解决方案
方案1:直接使用现有自定义实现(最稳妥)
你当前写的C#版Encode64已经完全对齐PHP原生实现的逻辑,不需要强行替换为内置Convert.ToBase64String,直接使用即可保证输出和WordPress逻辑完全一致,性能损失可以忽略不计。
方案2:基于内置Base64改造(不推荐,仅做参考)
如果一定要用内置方法实现,需要按以下步骤处理:
- 对输入字节数组按每3个字节一组,调整字节顺序适配标准Base64的比特分组逻辑
- 调用
Convert.ToBase64String生成标准Base64字符串 - 按映射表替换字符:
private const string STANDARD_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; private const string WP_ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // 替换逻辑:把标准base64的每个字符替换为WP字符集中对应索引的字符
- 去掉末尾的
=填充,按输入长度截取对应长度的输出:16字节输入保留前22位即可。
验证提示
你可以用固定salt和password的测试用例验证:分别用PHP版本和C#版本生成hash,确认输出完全一致即可。
内容的提问来源于stack exchange,提问作者GetUnstuck
相关产品推荐
相关产品推荐

