记录上传文件加壳

@PostMapping("/common/uploadApk")
    public AjaxResult uploadFileApk(MultipartFile file) throws Exception
    {
        try
        {
            // 上传文件路径
            String filePath = AlitedConfig.getUploadPath()+ "/"+ DateUtils.datePath()+ "/"+ UUID.randomUUID().toString(true);
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = serverConfig.getUrl() + fileName;
            String[] urls = url.split("/");
            String simpleName = urls[urls.length-1] ;

            File oldFile = new File(filePath+"/"+simpleName);
            File signFile = new File(filePath+"/sign/"+simpleName);
            if (!signFile.getParentFile().exists()){
                signFile.getParentFile().mkdir();
            }
            String sha = GetFileSHA256.getSHA256(oldFile);
            String sign = RsaUtils.signByPrivateKey(sha,RsaUtils.privateKey_A);
            try {
                OutputStream os = null;
                os = new BufferedOutputStream(new FileOutputStream(signFile));
                Base64 Base64 = new Base64();
                byte[] signBytes = Base64.decode(sign);

                byte[] signAllBytes = new byte[256];
                for (int i = 0;i<256;i++){
                    if (signBytes.length>i){
                        signAllBytes[i]=signBytes[i];
                    }else{
                        signAllBytes[i]=0x00;
                    }
                }
                os.write(signAllBytes, 0, signAllBytes.length);

                FileInputStream fileInputStream =  new FileInputStream(oldFile);
                byte[] buf = new byte[1024];
                int  bytesRead;
                while ((bytesRead = fileInputStream.read(buf)) > 0) {
                    os.write(buf, 0, bytesRead);
                }
                fileInputStream.close();
                os.close();

            }catch (Exception e){
                return AjaxResult.error(e.getMessage());
            }
            AjaxResult ajax = AjaxResult.success();
            ajax.put("fileName", fileName);
            ajax.put("url", url);

            ajax.put("simpleName", simpleName);
            ajax.put("ext", org.apache.commons.lang3.StringUtils.substring(simpleName, org.apache.commons.lang3.StringUtils.lastIndexOf(simpleName,".")+1)
            );
            //转换文件大小
            DecimalFormat df = new DecimalFormat("#.00");
            double fileSize=oldFile.length();
            String fileSizeString="";
            if (fileSize<1024){
                fileSizeString=df.format(fileSize)+"B";
            }else if (fileSize<(1024*1024) ){
                fileSizeString = df.format(fileSize/1024) + "KB";
            }else if (fileSize<(1024*1024*1024)){
                fileSizeString=df.format(fileSize/1024/1024) + "MB";
            }else {
                fileSizeString=df.format(fileSize/1024/1024/1024) + "GB";
            }
            ajax.put("fileSize",fileSizeString);
            ApkFile apkFile = new ApkFile(oldFile.getAbsolutePath());
            ApkMeta apkMeta = apkFile.getApkMeta();
            ajax.put("versionCode", apkMeta.getVersionCode());
            ajax.put("versionName", apkMeta.getVersionName());
            ajax.put("minSdkVersion", apkMeta.getMinSdkVersion());
            ajax.put("packageName", apkMeta.getPackageName());
            apkFile.close();
            boolean delete = oldFile.delete();
            boolean renameTo = signFile.renameTo(oldFile);

            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
package com.alited.common.utils;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RsaUtils {
    private static Logger logger= LoggerFactory.getLogger(RsaUtils.class);

    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
    public static final String CHATSET = "utf-8";

    public static final String publicKey_A = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtxl5hkVqKhjSxQZQSqmx\n" +
            "P6/EZK2gWyPMLfeUOOwZxlrYCfCRdfDe+MAXGnHw396+SbWJrGXBbw12m60FHfh+\n" +
            "otq9vvSC0JAeK1jxyeeBcq6UfHg2leGrlqIXnx8G782H/LPWxSObZNtVNAfuU+n7\n" +
            "PBSfiCxwVkBiHyk59F0LwPQwy7IE5FDb8nQ2koZhg3BdvPSAH7PlfCqBVz2VbcLL\n" +
            "5gcZA6TyGbeczezMboKc3uFvtuyOm3HADGNfQur97Za84BWI0pMdPnmIdlwaU61+\n" +
            "rtOACyqCa96HqQU3Vx00sNrtJHxMSlwbkcXME3o2nqtezzo6jTc/meNm85jE+UUn\n" +
            "yQIDAQAB";
    public static final String privateKey_A = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3GXmGRWoqGNLF\n" +
            "BlBKqbE/r8RkraBbI8wt95Q47BnGWtgJ8JF18N74wBcacfDf3r5JtYmsZcFvDXab\n" +
            "rQUd+H6i2r2+9ILQkB4rWPHJ54FyrpR8eDaV4auWohefHwbvzYf8s9bFI5tk21U0\n" +
            "B+5T6fs8FJ+ILHBWQGIfKTn0XQvA9DDLsgTkUNvydDaShmGDcF289IAfs+V8KoFX\n" +
            "PZVtwsvmBxkDpPIZt5zN7Mxugpze4W+27I6bccAMY19C6v3tlrzgFYjSkx0+eYh2\n" +
            "XBpTrX6u04ALKoJr3oepBTdXHTSw2u0kfExKXBuRxcwTejaeq17POjqNNz+Z42bz\n" +
            "mMT5RSfJAgMBAAECggEANMDQNJFXTx2rzDxPcdOGT/USPneP1fJwZ2YHfIb5vh56\n" +
            "VBLNtg9aDo05mtLtNXL1nEMDkXoXyykz3RJygPoRclZXiOblsbV0G8UalLNwplwK\n" +
            "R/pSr8g/Kb011RCZbQnofjRKUq45nUtcNwt57Q9i5SKD/DXhf9g47QVxvyf3tPWo\n" +
            "tfFWKqmFL/xYvrwKLEJj8ssf+JE4r1Oi1d73nR6J47JilQ6Gf2YwOISGufFIgpgX\n" +
            "mcGtyeMNqS6HoiQXt+S7Pz+ucTSTy4+2nodMLGRbPG46NMCcjb6IlOSRq2wS+Mwn\n" +
            "EtsAw+a2W1jwokmxbJ8kxqSOBqDbVTdcKY1qbPb/KQKBgQDtlFQlwX9dycOLUzz5\n" +
            "8szWld1WrfgLirdja+9e8fUiHW/RWSqmW6io8+4s/Ax3o4Zn4dvgaOwNrNUh7Gki\n" +
            "S7EYjFMbvoc39CFn/Ubzd/VFLOF3BJYniZd+Ut0Nve5j2HSkDFOEhDpnlIb8kiQ3\n" +
            "bbA0OXfqazCc8KlKQfbA8od/LwKBgQDFS8jCsQt35uLugbyiYAM3eHNKebd+72lh\n" +
            "Tvxbd+WJ3XdjVOKktdVBXa+QQYR02G3YpyQMGuuMu78lORAwxq/iCv7KPG9loKIf\n" +
            "kytLvWyToTebDta3erwXQTU5g/RnMMEt6SO3AQ+x2KYKYk+g59CoMCpR7wJaBFOb\n" +
            "/XRMgGrKhwKBgQCEUvdDSDC+diA5u5TcykUYx8POAXuEQjC+aWGbijw0Uhzzhyxg\n" +
            "F/EqmSJxX7k58ZRsy7mBli7Ttw3GpTwxY+MxfwbTDx2VJp5sov8foBK2ArdZaO6Q\n" +
            "+uur6k9A1iau6eKddFgYGOXGx00f4+3UCX34uIF3yVf8MXa462CaOvsI9QKBgAgm\n" +
            "ODWqgHHEbK0zWKpQUvGwnPp/io/Irc6iJ5RToHyQVEUbFX1+MT/Q8daAjksRQYBI\n" +
            "bxm85uvaOWv9LmkFW/B3SczqsCM/flLVjl1Dhr+WUiiqdT4A6NIBFIS6qZa1kdUm\n" +
            "ox4FAjPzYfBd3TIlQR4hVy4pNCyprxZrYqliSIbzAoGBAMR/RdQ6T5O+7ZJ1oTdc\n" +
            "32l7067FefxpTXGJPOmztScwsWoUao3Cb7LanPFVjw8rke+Qb00LXhySrCxsYaY+\n" +
            "C1THMcl7ydmK0r715FFcVdZJRWK/+/Ho6jtQLOVdByKOpgcF93xiT0HNjdQuFNXT\n" +
            "a9GIA5zmC4CoEbC2/HjhVUVf";

    public static void main(String[] args) {
        //消息明文
        String msg = "sdfdsgeryer";
        //签名
        String sign = signByPrivateKey(msg, privateKey_A);
        System.out.println(sign);
        Boolean tf = verifySignPublickey(msg, publicKey_A, sign);
        System.out.println(tf);
    }
    /**
     * RSA签名检查
     * content待签名的数据
     * sign 签名值
     * publicKey公钥
     * return 布尔值
     */
    private static Boolean verifySignPublickey(String content, String publicKey, String sign) {
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            Base64 Base64 = new Base64();
            byte[] encodedKey = Base64.decode(publicKey);
            PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

            Signature signature = Signature.getInstance(SIGN_ALGORITHMS);

            signature.initVerify(pubKey);
            signature.update(content.getBytes(CHATSET));

            boolean bverify = signature.verify(Base64.decode(sign));
            return bverify;

        } catch (Exception e) {
            logger.info(e.getMessage(), e);
        }
        return false;
    }

    /**
     * RSA签名
     * @param content 待签名数据
     * @param privateKey 商户私钥
     * @return 签名值
     */
    public static String signByPrivateKey(String content, String privateKey) {
        try {
            Base64 Base64 = new Base64();
            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
            KeyFactory keyf = KeyFactory.getInstance("RSA");
            PrivateKey priKey = keyf.generatePrivate(priPKCS8);

            Signature signature = Signature.getInstance(SIGN_ALGORITHMS);

            signature.initSign(priKey);
            signature.update(content.getBytes(CHATSET));

            byte[] signed = signature.sign();

            return Base64.encodeAsString(signed);

        } catch (Exception e) {
            logger.info(e.getMessage(), e);
        }
        return null;
    }

    public static String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder("");

        if (src == null || src.length <= 0) {
            return null;
        }

        for (int i = 0; i < src.length; i++) {
            String hv = Integer.toHexString(src[i] & 0xFF);

            if (hv.length() < 2) {
                stringBuilder.append(0);
            }

            stringBuilder.append(hv);
        }

        return stringBuilder.toString();
    }

    public static byte[] hexStringToBytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }

        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];

        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }

        return d;
    }

    private static byte charToByte(char c) {
        return (byte) "0123456789ABCDEF".indexOf(c);
    }
}
package com.alited.project.tool;

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

/**
 * @version 1.0
 * @date 2022/3/8 18:23
 */
public class GetFileSHA256 {
    public static String getSHA256(File file){
        FileInputStream fileInputStream = null;
        // 缓冲区大小
        int bufferSize = 256 * 1024;
        DigestInputStream digestInputStream = null;
        try{
            fileInputStream = new FileInputStream(file);
            // 拿到一个SHA256转换器(这里可以换成MD5)
            MessageDigest messageDigest =MessageDigest.getInstance("SHA-256");
            // 使用DigestInputStream
            digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
            // read的过程中进行SHA1处理,直到读完文件
            byte[] buffer =new byte[bufferSize];
            while (digestInputStream.read(buffer) > 0);
            // 获取最终的MessageDigest
            messageDigest= digestInputStream.getMessageDigest();
            // 拿到结果,也是字节数组,包含16个元素
            byte[] resultByteArray = messageDigest.digest();
            // 把字节数组转换成字符串
            return byteArrayToHex(resultByteArray);
            // return new String(resultByteArray);
        }catch(Exception e) {
            return null;
        }finally{
            try{
                digestInputStream.close();
                fileInputStream.close();
            }catch (Exception e) {

            }
        }
    }

    /**
     * 将字节数组换成成16进制的字符串
     * @param byteArray
     * @return
     */
    public static String byteArrayToHex(byte[] byteArray) {
        // 首先初始化一个字符数组,用来存放每个16进制字符
        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };
        // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
        char[] resultCharArray =new char[byteArray.length * 2];
        // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];
            resultCharArray[index++] = hexDigits[b& 0xf];
        }
        // 字符数组组合成字符串返回
        return new String(resultCharArray);
    }

    public static void main(String[] args) {
        String fileName ="D:\\app\\DJHsmAPI.ini";
        System.out.println(fileName);
        File file;
        file= new File(fileName);
        System.out.println(file.exists());
        System.out.println(getSHA256(file));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wen先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值