You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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改造(不推荐,仅做参考)

如果一定要用内置方法实现,需要按以下步骤处理:

  1. 对输入字节数组按每3个字节一组,调整字节顺序适配标准Base64的比特分组逻辑
  2. 调用Convert.ToBase64String生成标准Base64字符串
  3. 按映射表替换字符:
private const string STANDARD_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private const string WP_ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
// 替换逻辑:把标准base64的每个字符替换为WP字符集中对应索引的字符
  1. 去掉末尾的=填充,按输入长度截取对应长度的输出:16字节输入保留前22位即可。

验证提示

你可以用固定salt和password的测试用例验证:分别用PHP版本和C#版本生成hash,确认输出完全一致即可。

内容的提问来源于stack exchange,提问作者GetUnstuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:45:05