一个狗屁问题之不可见的分隔符之Zero-with-space
仅仅记录一番
线上业务解密异常。
检查对比代码无异常。复制信息制作demo解密无异常。
打印密钥发现一模一样,但是一个程序可以解密一个程序解密不了,怀疑是编码问题,编码也调整测试了还是不行,然后有点怀疑人生了。
反复测试发现完全一样的密钥,长度不一样。
检出数据库中存储密钥与本地打印密钥 转16进制进行对比发现数据库中密钥16进制比原密钥多了e2808b字符
解决办法:
有关这种特殊字元存在以下三种形式:
Unicode code point |
character |
UTF-8 (in literal) |
name |
---|---|---|---|
U+200B |
\xe2\x80\x8b |
ZERO WIDTH SPACE |
|
U+200C |
|
\xe2\x80\x8c |
ZERO WIDTH NON-JOINER |
U+200D |
|
\xe2\x80\x8d |
ZERO WIDTH JOINER |
$key = preg_replace('/\p{C}+/u', "", $key);
// remove zero width space
$value = str_replace("\xe2\x80\x8b", '', $value);
$value = str_replace("\xe2\x80\x8c", '', $value);
$value = str_replace("\xe2\x80\x8d", '', $value);
Nice to see you all!