【仅供内部供应商使用,不提供对外解答和培训】

Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
themeEclipse
firstline1
titleBaseInterceptor.java
linenumberstrue
collapsetrue
package com.tptj.demo.hg.template.encrypt;

import com.fr.base.io.EncryptIOFileProxy;
import com.fr.base.io.IOFile;
import com.fr.file.FILE;
import com.fr.invoke.Reflect;
import com.fr.log.FineLoggerFactory;
import com.tptj.demo.hg.template.encrypt.ui.DecodeDialog;
import com.tptj.demo.hg.template.encrypt.ui.SpEncryptAttrMark;

/**
 * @author 秃破天际
 * @version 10.0
 * Created by 秃破天际 on 2021/9/12
 **/
public class BaseInterceptor {
    /**
     * 在打开模板前对加密的模板插入输入密码的弹窗
     * @param file
     */
    public static void intercept4Edit(FILE file){
        try {
            file.asInputStream();
            if( !DemoEncryptor.hasSecret() ){
                return;
            }
            String secret = DemoEncryptor.getSecret();
            secret = new DecodeDialog(file,secret).getSecret();
            DemoEncryptor.setSecret(secret);
        } catch (Exception e) {
            FineLoggerFactory.getLogger().error(e,e.getMessage());
        }
    }

    /**
     * 在保存模板前获取配置的模板密钥,以便加密接口进行加密
     * @param origin
     */
    public static void intercept4Save( EncryptIOFileProxy origin ){
        IOFile report = Reflect.on(origin).get("file");
        SpEncryptAttrMark mark = report.getAttrMark(SpEncryptAttrMark.XML_TAG);
        if( null != mark ){
            DemoEncryptor.setSecret(mark.getSecret());
        }
    }
}

...

Code Block
languagejava
themeEclipse
firstline1
titleDemoEncryptor.java
linenumberstruecollapsetrue
package com.tptj.demo.hg.template.encrypt;

import com.fr.general.CommonIOUtils;
import com.fr.report.fun.impl.AbstractTemplateEncryptProvider;
import com.fr.security.SecurityToolbox;
import com.fr.stable.CodeUtils;
import com.fr.stable.StringUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * @author 秃破天际
 * @version 10.0
 * Created by 秃破天际 on 2021/9/12
 **/
public class DemoEncryptor extends AbstractTemplateEncryptProvider {

    public static final String TAG_START = "-----Encrypt Start-----";
    public static final String TAG_END = "-----Encrypt End-----";

    public static ThreadLocal<String> holder = new ThreadLocal<String>();
    public static ThreadLocal<Integer> pos = new ThreadLocal<Integer>();
    public static ThreadLocal<Boolean> init = new ThreadLocal<Boolean>();

    public static void setSecret(String secret) {
        holder.set(secret);
    }

    public static String getSecret() {
        return holder.get();
    }

    public static boolean hasSecret() {
        return StringUtils.isNotEmpty(getSecret());
    }

    public static int getPos(){
        return pos.get();
    }

    public static void setPos(int idx){
        pos.set(idx);
    }

    public static void initData(InputStream in){
        init.set(true);
        String data = StringUtils.EMPTY;
        try{
            data = CommonIOUtils.inputStream2String(in);
            if(!data.startsWith(TAG_START)){
                setSecret(StringUtils.EMPTY);
                setPos(-1);
                return;
            }
            int end = data.indexOf(TAG_END);
            String part = data.substring(TAG_START.length(),end);
            String sha = part.substring(0,64);
            String code = part.substring(64);
            String secret = CodeUtils.passwordDecode("___"+code);
            if( !CodeUtils.md5Encode(secret, StringUtils.EMPTY,"SHA-256").equals(sha) ){
                setSecret(StringUtils.EMPTY);
                setPos(-1);
                return;
            }
            setSecret(secret);
            setPos(end+TAG_END.length());
        }catch(Exception e){
            setSecret(StringUtils.EMPTY);
            setPos(-1);
        }
    }

    private String codePassword(){
        String secret = getSecret();
        String code = CodeUtils.passwordEncode(secret).substring(3);
        String sha = CodeUtils.md5Encode(secret, StringUtils.EMPTY,"SHA-256");
        return sha+code;
    }

    @Override
    public InputStream encode(InputStream in) {
        if( !hasSecret() ){
            return in;
        }
        byte[] bytes = CommonIOUtils.inputStream2Bytes(in);
        try{
            String secret = getSecret();
            String data = new String(bytes,"UTF-8");
            data = TAG_START +codePassword()+TAG_END+
                    SecurityToolbox.aesEncrypt( data, secret);
            return new ByteArrayInputStream(data.getBytes("UTF-8"));
        }catch (Exception e){
            return new ByteArrayInputStream(bytes);
        }
    }

    @Override
    public InputStream decode(InputStream in) {
        byte[] bytes = CommonIOUtils.inputStream2Bytes(in);
        try{
            if( !Boolean.TRUE.equals(init.get()) ){
               initData(new ByteArrayInputStream(bytes));
            }
            if( !hasSecret() ){
                return new ByteArrayInputStream(bytes);
            }
            String data = new String(bytes,"UTF-8");
            data = data.substring( getPos() );
            data = SecurityToolbox.aesDecrypt( data, getSecret() );
            return new ByteArrayInputStream(data.getBytes("UTF-8"));
        }catch (Exception e){
            return new ByteArrayInputStream(bytes);
        }
    }

}

...

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。

demo-parametertemplate-decode【两种接口实现的基于MD5的密码防篡改代码】encrypt【完整示例】