网站内容加密之字体加密法:字体加密具体操作

思路参照:

Web 端反爬技术方案,请先看完此文。否则以下内容你会有些蒙。

步骤概括:

ttf => svg => 加密并清理不加密得字符 => svg => woff/woff2

具体步骤:

一、整理需要加密的“字”:

先将网站常用字体统计处理,这个不管你用什么方式,人工还是程序,都要先统计出来,因为你不可能把所有文字都加密混编,那样字体文件就太大了,网站加载会出问题。
这个时候你就有了你的需要加密的字体的清单了。

二、清理不加密的字,并将需要加密的字的字符加密:

如果网站针对window系统,那么就用工具将微软雅黑字体导出svg格式,svg其实也是xml的一种,里面每个字的节点会有个属性:unicode, 这个编码就是这个字的unicode值,不过是ucs-4字符集所对应的。用你所熟悉的编程语言,将你第一步整理出来的待加密文字清单 里 意外的文字从 这个svg文件中清除.
怎么除每个语言不太相同,我的思路是将xml转换成array,然后处理,处理完再转换成xml,附送需要的代码(PHP版本):

//xml转array
$xml = simplexml_load_string(file_get_contents("msyh.svg"));
$xml_json = json_encode($xml);//将对象转换个JSON  
$xml_arr  = json_decode($xml_json, true);

//array转xml
function arr2xml($arr,$parentNode=null){
    //如果父节点为null,则创建root节点,否则就使用父节点
    if($parentNode === null){
        $simxml = new \SimpleXMLElement('');
    }else{
        $simxml = $parentNode;
    }
    //遍历数组
    foreach($arr as $k => $v){
        //再将xml转换成数组的时候,xml节点的属性会变成子数组,键名是@attributes,
        //在转回xml的时候,就需要特殊处理,将这个数组添加为属性,而不是节点
        if($k === '@attributes'){
            foreach ($v as $name => $value){
                if($name === 'unicode'){
                    //注意这个‘&#x’中的‘&’,在保存为xml文件是,会被转移为&记得在导出文件后批量替换掉。
                    $value = "&#x".ltrim(bin2hex(iconv('UTF-8', 'UCS-4', $value)), '0').';';
                }
                $simxml->addAttribute($name, $value);
            }
        }else{
            if(is_numeric($k))
                $k = 'glyph';
            if(is_array($v)){//如果是数组的话则继续递归调用,并以该键值创建父节点
                arr2xml($v, $simxml->addChild($k));
            }else{
                $simxml->addChild($k, $v);
            }
        }
    }
    //返回数据
    header('Content-type:text/xml;charset=utf-8');
    return $simxml->saveXML();
}

注意:每个svg文件里的glyph节点的unicode属性值,便是你要加密的值,如果这个值不修改,继续保留,那么你就跟没有加密一样。你要做的就是用你自己的加密算发,将这个值修改,但是修改的结果必须保证在unicode值得范围内,你不要乱改成超出范围得值,否则最后依然无法生成字体文件得。

三、转换为woff

将上一步修改后的xml文件得后缀名改为svg,然后在百度在线字体编辑器里将svg导出为woff或者woff2。woff得兼容性比woff2好,woff2得体积比woff小30%左右,根据你的需求选择相应格式。

接下来怎么做,请回到文章开头推荐的另外一个文章里,你就明白了。

你可能感兴趣的:(svg,字体)