若依基于sm-crypto实现前后端登录密码加密

news2024/11/19 16:31:17

上一节介绍了基于jsencrypt实现的密码加密解密登录功能,这次来介绍基于sm-crypto实现前后端登录密码加密,本次采用的是sm2进行的加密解密。

后端

首先从后端代码开始写起(因为公钥和私钥都是要从java代码中生成):
首先需要引入sm-crypto的jar包,点击获取jar包,然后拷贝到下面的目录下
在这里插入图片描述
然后再pom.xml文件中引入依赖,然后刷新依赖

        <!--sm2jar包依赖-->
        <dependency>
            <groupId>com.sm2</groupId>
            <artifactId>sm2</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/sm-crypto-0.3.2.jar</systemPath>
        </dependency>

然后就是新建一个工具类

package com.ruoyi.common.utils.sm2Encrypt;

import com.antherd.smcrypto.sm2.Keypair;
import com.antherd.smcrypto.sm2.Sm2;
import io.netty.util.internal.StringUtil;
import org.springframework.stereotype.Component;

import java.util.ArrayList;

@Component
public class SM2Encryptor {

    private static final SmKeyPair smKeyPair = new SmKeyPair();
    public static String privateKeys = "";
    private static String publicKeyStr = "";
    private static String privateKeyStr = "92b704fee9ac448ac27abfa537021ab42d0035151f01fdc03e49b0c2f5496148";

    /**
     * 加密,使用公钥
     *
     * @param publicKey
     * @param originalText
     * @return
     */
    public static String encryptText(String publicKey, String originalText) throws Exception {
        if (StringUtil.isNullOrEmpty(publicKey)) {
            throw new Exception("密钥不能为空...");
        }
        if (StringUtil.isNullOrEmpty(originalText)) {
            throw new Exception("明文不能为空...");
        }

        try {
            return Sm2.doEncrypt(originalText, publicKey);//HexUtil.encodeHexStr(cipherText); // 加密结果
        } catch (Exception e) {
            throw new Exception("加密错误:密钥不正确...");
        }
    }

    public static String getPublicKey() {
        return publicKeyStr;
    }

    public static String getPrivateKey() {
        return privateKeyStr;
    }

    public static SmKeyPair smKeyPair() {
        return smKeyPair;
    }

    /**
     * 解密,使用私钥
     *
     * @param privateKey
     * @param cipherText
     * @return
     */
    public static String decryptText(String privateKey, String cipherText) throws Exception {
        if (StringUtil.isNullOrEmpty(privateKey)) {
            throw new Exception("密钥不能为空...");
        }
        if (StringUtil.isNullOrEmpty(cipherText)) {
            throw new Exception("明文不能为空...");
        }
        try {
			String s = Sm2.doDecrypt(cipherText, privateKey);
            System.out.println(s);
            return Sm2.doDecrypt(cipherText, privateKey); // new String(sm2.decrypt(sourceData,prvKey)); // 解密结果
        } catch (Exception e) {
            throw new Exception("解密错误:密钥不正确...");
        }
    }

    /**
     * 获取sm2密钥对,
     *
     * @return 返回String[];第0个为公钥,第1个为私钥
     * @throws Exception
     */
    public static String[] generateKeyPair() throws Exception {
        try {
            Keypair keypair = Sm2.generateKeyPairHex();
            String[] result = new String[2];
            if (keypair != null) {
                result[0] = keypair.getPublicKey(); //公钥
                smKeyPair.setPublicKey(keypair.getPublicKey());
                publicKeyStr = keypair.getPublicKey();
                result[1] = keypair.getPrivateKey(); // 私钥
                smKeyPair.setPrivateKey(keypair.getPrivateKey());
                privateKeyStr = keypair.getPrivateKey();
            }
            return result;
        } catch (Exception e) {
            throw new Exception("生成密钥对失败...");
        }
    }

    public static void main(String[] args) throws Exception {
//		生成一对 公钥与私钥
        String[] keys = generateKeyPair();
//		公钥
        String publicKey = keys[0];
//		String publicKey = publicKeyStr;
        System.out.println("公钥" + publicKey);
//		私钥
        String privateKey = privateKeyStr;
        System.out.println("私钥" + privateKey);

//		String str = "测试使用SM2加密、解密";
        String str = "166ed3fc69afcfee4f1ba2034c36dac93d86dcad176219407776100130a506d9";
        try {
            //加密字符串
            String encryptText = SM2Encryptor.encryptText(publicKey, str);
            System.out.println(encryptText);
        } catch (Exception e) {


        }


        //解密字符串
        String decryptText = "null";
        try {
            decryptText = SM2Encryptor.decryptText("", str);
            System.out.println("成功解密后为:"+decryptText);
        } catch (Exception e) {
            System.out.println("失败");
        }


    }

    public static void main11(String[] args) throws Exception {
        ArrayList<String> strings = new ArrayList<>();
        String str = ("$2a$10$0OXfRm8Jc4XdRFHeXFovB.UKX2DjLfgPYYS/6mz7KSym87LazK.6a,$2a$10$0OXfRm8Jc4XdRFHeXFovB.UKX2DjLfgPYYS/6mz7KSym87LazK.6a,$2a$10$0OXfRm8Jc4XdRFHeXFovB.UKX2DjLfgPYYS/6mz7KSym87LazK.6a,$2a$10$nByAilbqXIko9uf/hj5VKOXiHYlW0e7x0HDDrqLuc/BtYantNFe2u,$2a$10$4O5pYOYvPZPbZNiP5Pn2BeiMD7hTiZi4cenk6heyKFx12E2IMqlTG,$2a$10$obSpw9ZU.el9F06cVudY4us4xqcW7M2gsdU2QrfmMmfqhyOjWzGc6,$2a$10$rKXmSKy9WLhOE5fY2HdL0.OcEWWzmP2yfmCMfGlMRTZl/mC2JOIVi,$2a$10$VUQ2jwnZftQM063Ln5icce2BFmbiWLn.PiYdg7VrrH64SOiiux8zC,"+
                "$2a$10$XnLqxv.CrFadLsdVvhW95.BViBnV3eOWSUshugmnBKPUob2XHm.xy,$2a$10$dUSnoJ5bXAii8CxGE1IcVOQxReiNXi0U2Cpl59lBefAruaIfrs88y,2a$10$xhHW7ERYY/Hw3IwL01u0P.8eLzdWNmagMikN/2WGtfrIdCOR.QLVa,$2a$10$W0bxfRzFzCtZcaLIqDWPQeIjIy/IaFXLbd3C6Ex6IE94JAhkPH7Jm,$2a$10$z1v1aRBeUE0XwASZXbjURO685AWBM008iL1BQpdFTccvXvg1h1uxe,$2a$10$WjoOi6vBZejpENmiXBFKZeJHPxF9i4Xtc0q2qObrdRS5fQ7tjWJeK,$2a$10$YbwwDYokkeVAkiKvdsUeveYirXfDZ50cxwWcX7RY7Wq97WBaJHdzK,$2a$10$gBUTW.okA8122Uxz5d7opu/nHSY7ketS1m8OkIXsr/7yYmkv8Fpru,$2a$10$9w/CwxYzdAWtczRP0AhIW.HLZSnWjPYSqyUDsbtW0Prg7doVuG9se,$2a$10$BNNKWdbm4D0.x77SDV/ME.kVjN78bfiBuC9UFf7fmWwLWIX4CLwsq,$2a$10$lzRWuhQKCiD5gK2waXYdEOD.YvjX1d/cbwOXJNtjajNxMCNvOUMGa,$2a$10$wE2i08bEY/x84R/IRAqPoeJyc2EuDrH84tNzesoFhr18qc.3cpXLG,$2a$10$fd/LEGgdfWe6JchTJP2G1ukwOY5chU3Gc4AyTujknzqcA6lnpryq.,$2a$10$nao.cM1CCRxjAcabg16fmunEhZJJQUQvOAreUOTrXIzosuQfwUgcq,"+
                "$2a$10$rb1lodozm6F2O1HZOwDbLus89XhJDW5sBbZIsi9Dt/PPPETvpo.Oe,$2a$10$hyyW3XZd6QrgYRWPbQVXxeouO2Onipjexlvuxp2kTh6h3RdLnREXS,$2a$10$9xEXMdd6t5JDyHmf5b2JZOgswBvoifkJHw.d6lk/pXH7rQ1vTRPwq,$2a$10$BNlXJqjRQ08lHoh1mAYfleQYJ7KHjRw9VKJq7IZeYwILpjurWlWA6,$2a$10$.5zW9ORnRQsS6OtjsfQmauprEj7z9EhB9YfSGN8qZMN9YJ3PaUEou,$2a$10$iX43ZtDY/8fyDiYjavXj1Oj6rj.2osBI3y.IfNkiXz5AV5rMfbT7K,$2a$10$FuCMGR.znZn7zGZNwYCa/.bKFPjBX.8Iq2blu7QtHfEf8Hu9IbkLu,$2a$10$wIbkN50SjpmsbxCXjuwcaOfq0EQ05YfxCTqNzrCUwVIROOvfo9D/.,"+
                "$2a$10$k1WDKOPXoEVu4p6mk8rTROUONXvZGEK8l0RO8NdNjVqnUvLaqEx9a,$2a$10$jlNUUjFiXACK70h4cHLRyuZ0Z1ldyeb167SrCU/OXwbSkkd2PbpMO,$2a$10$OyI36lNuUN1FlIrjaVW9KuESt/OxcKQ2GttQ378JL.stFxlb/hjdi,$2a$10$MaAGznguMJuWpFt.dHfywuEZ5QOr0YV0NDL.qbYN97uEX6pfZXwRi,$2a$10$D6ON3RwVT2frFZfaOA.nNuSBuMQmGY57/vnehKZfhXoztYCYhtyKK,$2a$10$YHpxrHMKC56vkyybaHfstuHGy9YOt2a828qP7VyWnAVOeY8o3SVYy,$2a$10$E.91z/MiLlOono1pwmzo2..Ka2Hf6pyr.uVQCYJYqrOZLnfe9BqLG,$2a$10$f02b1NTFiPBGWVwyMOyMw.g7xVq1hsegBpPdoi0afT17PqNrLOaba,"+
                "$2a$10$WS4zO1Odf0pa2S3SB0UDbObR5tVQWnql6XnXrnxSjGdasq24kx9VG,$2a$10$xPhPCcYIZO0UFJMnkl8ZW.30wgfc494IdUSKu6/DP3Z7GnqOxZ1By,$2a$10$.yLwueJ/xQueMcH3qa55eOBPjWJDB0oBLS3F3VGY8il8zvoft6EJu,$2a$10$Nx8pouYgkoBSCz86uEcvn.ExNQNaXIStSqB3fsNfbdP5Oj47zx4Ra,$2a$10$u3cFkCt2qgpYMMewjAuBm.C.FFvBjMSr0VaI6r1e8epInmvNpEbBy,$2a$10$vV7cPypCsNemcD9ZiQrNG.bUskbxKzzz73t4Fnq5UoRPQGtFSQePq,$2a$10$OKb.aK9Ofb/cEMHYvjWFwuu.CdFwby15ZdyetNwGUKxRMYLmZNk52,$2a$10$WarCwyP5JWp2Rrc4xC3CUex1FKRX4bY62fSj..tUd8PmlHxF8I82G,"+
                "$2a$10$y/JUE6C7NPnTuZjJWnMW1u7VRfeFbn18kB1HK1H1yT5cxQbJcvgIW,$2a$10$f1DBVIc1CQWVbZAY1zsk4OMS7ovVOPF8fzb9J4oUSpJ5tl5PLlOJe,$2a$10$OsgtQDRgQ0Qqnc0m/Oe3g.Fac6/6MmoFd7YIa38Jm8MiywlcvhrVG,$2a$10$2YkCgG9I6I/ihqW0mdzMKuSgntMiqfIN128ynjm/fJkMJCcaK7Ae.,$2a$10$tDKZGVoIk9bmsB8Zta4DweuPSG4gwzNHG5nqL/tONWqewKSmVPrYW,$2a$10$zHMR6OOPfE8oVVpdWIWANOIVPT75n1FhPknmRVloVmzyotH5G0JD.,$2a$10$AbbSKDa9HFL5LHg1PRif.ukfiC90Ybp4dBrLL82xKj3Qc19N4S7I2,$2a$10$4KJULL05MP3ZPihFp3Myu.kDQORG7qFdv2MHJnef7FUfidChXNUjm,"+
                "$2a$10$bMoOo/2zkM6CUOghx6Onk.P2yfMmqzX849k.MxB8Nm5ezVia14yW.,$2a$10$5uFQ/Jo/TfEPM8MA9MGisu/0RnXZO7jhjp8ewt.luFjEUnIZrjnHm,$2a$10$TYx.EIPGoEZwkKIQY7rAr.Jy/AiKNHj1kdYOacy81YsEkHtnecXDW,$2a$10$hP/tWvd4rwZP3vFMrE5DTez.b09QP8VOVGHSudYIGO079FKaHis86,$2a$10$kLz0tAJV6X9nnpyR/Aeh3OPtzqA4cBtMLCCRg8nX7TRbpGei8YkX6,$2a$10$njtEzD8ByMxIhrsKLwkpW.Rjy/IigzxOdsmnUcJ0H91JenXufZ3zS,$2a$10$le42slw2CQuB/miKG7mwBOgjMuhV5/kKOatcH02rsn.i5TKFcgilm,$2a$10$kSgjpIQDX0cK7PVzuUwEtexvUFLtMrJto7fujg2GG40j0r5wHy3qa,"+
                "$2a$10$MaPwMPePfNeLxm0uHvGqSOv/n8GnFj2DADJptclHIA3QHvXLCnS46,$2a$10$WorTE9Pfwdo4NyN8U6yHFu.Fek7jzQwuYlJyN26T2XO3kjKCB9SlS,$2a$10$hlFqSYJfHRaT/xp9c2rBb.wrjkQ/xGZ0qjO.aBrmHJFDZqWzTtHda,$2a$10$uvpPJsnFS4llREzWF28o7eOJk0LW8RwACfINCG1dgG/RaePpdRC0S,$2a$10$8JRFUion6Ti73uMM.vs1QeMB.IbB1BZlwiGM0yIk2UWdgkovx6yBK,$2a$10$TQXkcaewixOK3l14vLUxg.HLYK5eJshvBKptE9D8pXiuhw5d/Z6du,$2a$10$N1xgnv.hEYUliyfXgLdeNe3gu206P3jP.jB5OqDFFhxAMS.p6Je9i,$2a$10$EBoY8MP2rSCKi4Rsx28PTOUzwItMFTfnNaCqy5JxBtYOt024ZpWLa,"+
                "$2a$10$yV16ItAE/QnTmk58Bqybl.5GyGs1lODq/eXzSNzFzYNQF67QU2UqC,$2a$10$pfUsqj2DbJh95X0Dfx/j6Oe1KVNnaHg.JJDnzG49ALuhI5nbH81wW,$2a$10$IxlPhjKsfrOTfoFkY4EXqOUUrsA3HFMwi88T/CgpTOaqJTZHTzPEy,$2a$10$Mo5PVL7q6IZZx5mjdQVWquZjj8tCYAtT/WvOi3Dh5uCLOsSmY5Oxi,$2a$10$bF9l.0MqIFP8nND.Bnew/OO1C1A1HzC5H/zH8pMEbGKz.StTl2UMG,$2a$10$0fOx2IGytasxA9A4bZHcm.FxV4vXRXEggQOzFQ9H9ZvRoRlN08wby,$2a$10$afmUV4Ea98i7M46C67sVS.EgAO4q3bociwUXrg.MryBbGvTyk1rdO,$2a$10$BaydepEWPGWKHpztcy0X9.MT3JT9N8ok3qMYniSyDTb70UitqCACi,"+
                "$2a$10$rm8ACuVu/L5WrGIx6GQzmOCe5jIeFWqMea4PK7LiIY9y3lA6V2mue,$2a$10$g78j/vHGwDbJ6owQyLAVX.aZltVX7tiLkPUX74B2o2MSfdEHfD8Je,$2a$10$WlsChXQbTsXH0Ixfzquif.nwvym91K0nAemBEyudvfzVQAefE/.5a,$2a$10$B1QKr/6AYWbW6LP7zn.IIOCkSw/KGPr4FLtfPU0c0eplDvO88uF8m,$2a$10$u7nf2JtZVSwaRsmrpL/0iOmUrv3C7rKr9ZgCUe4tYF/qshtnwgR2a,$2a$10$vhQWireOCR4WF24XTXOoQuKSlFg8B9WmOSb3iFXmU50MAf1Qjmj7i,$2a$10$56cj/0IFOJi7cBPY3GgepuQA/VC98PjJtprYA8YBIkg7WDvd3K5Da,$2a$10$IePmIGZ4WcQGBeR.9vsqgu0UcnP/lPgApJ8uReJBAzImuk3wL1wUC,"+
                "$2a$10$is6Qwxc1/yKJrOITuf4z4.IGgLOJIFovpZhvGd91dfrsdoSs28LlO,$2a$10$SnDCCzlrIqT7oTAZ5KUnB.2ODLSBg4UUDpJ5tbhnflMH1ZcXF/.46,$2a$10$q97bqc579DEFSU8.9ka0ruuCkCQ2qybDvFdt5xsYgokxpldpSqIGu,$2a$10$8CVy5hN8ztP80p/5i9BYq.7ev5q9NNun1JG8P/re3wglgvcIG.MuG,$2a$10$0mud1YlzY.l5rxHkV16Veu3Qtw3Dbfc9MC9AqSSyS5c7X5orTGGdC,$2a$10$E2NhAxELYXJZQvwtEjhh5Of/tLKlhy7NCAtjacxQXfE1totdK2TUm,$2a$10$CghuySHeWIzrmzsYq2Q.HeLItIK5SeAoaLTC6sThidNtAk50BVbCC,$2a$10$gAa8lhKJpiK5KFMWgH7VCuioNsys/8EEsFOOzw.0G.O1jEbsoNyCC,"+
                "$2a$10$LpBends9aroD4uZOR0UB9.u7HROrFRtHOj5DbnCiUD3bT49HJTovK,$2a$10$SePADrelDadID7JmXqyfC.a0oaj0cScph6oXXamodOZdr//dnZSje,$2a$10$ghijJFE5V7uGzoQ6Yrq0Ce6CC.Yj8v.onKr9yuxdHYZcGx2rXzWTK,$2a$10$9NV3bUgsS4c.RHcwnF6OVOd7w1u.sa0X4vQkDq1J9.pPT5o8AWbx6,$2a$10$vH5cEESBaZWgOBf3GQsMHuW8LbtFH.7hvYNYYWsAOBad353uz8FhG,$2a$10$L7T0X60X.Bme0HOx.xR4s.BfRCzMEBinj2lfL8UXgZWNvDM2TnUh6,$2a$10$PkxOj4JHd53OCttbQPZofuLfRkyWno7hGQfKw1.hBy3jD0gUisJgm,$2a$10$B8.QnBNqITn1uT4nydWuneM9X.mqKYCPSxohR/7SF.S1X3b/XWYLa,"+
                "$2a$10$nnK/wOCVzZTwU2ZrYVoNdOuhyWm/vDiqNJn.vTkVEFu137HOQagu.,$2a$10$wuFgwwNS9DDnj1vi.iq94up3KStQFUs7pN2gO/ndI6ERMbdeAa2sm,$2a$10$I6HqOxQe7YCZ5Icmva3jw.h3KGw9B6N9Uo6Tcg0r62bHKg6xWYKO6,$2a$10$yRn6PaFnHoujIgXqfEJcHepvXvEN0m5Qa.19RNV28H7IwzOt4Hhxu,$2a$10$ucs4zz9jCSzyDEA0LJqrX.RosuU1sPuSvBiM1IPL1nsX5V59it0Au,$2a$10$7YFVsVTqykrSXVu3bPl1S.uoj2onQwi21eVt6mZY3Y/dVpxTEgoLW,$2a$10$hNcAC5qMNTTxz.vH1nZLP.T4S9sPNTuG0KgDX1hylcMrMpaEfwRZ2,$2a$10$kupfow5/FMa7LNSaLoKM5.d5zU0icKtKSH8WHx30irK3G.C3pLyee,"+
                "$2a$10$N6xPqq44DmnBlWbJgiMNye/Fzm3.yxYwXIDBeALhBZNN1.xonwMdG,$2a$10$pYPzdyOaDBlOUd1PcGZDJeK5dtE35j4qNgJVHdCYPpxctmZ56Jrum,$2a$10$jRU.o6rq0fe3mPqO/YDZiu/rWyZop4UPYjUf27EbEfTxX56e2eM82,$2a$10$.tZ6GCOI/EG1x5Z7scAauOgNkFduxJf94oVB0tyEGllcRXje6UX9u,$2a$10$uIg7q24d34w4qa81YnQjwuYVK25EJxgw6DPn0KiLVQQ04CNfqd.0u,$2a$10$Hl67tZsGzurSuq1aXOmTguu6QF46GURJuyJxGIHTRATxSMsNFtJ2W,$2a$10$Qo0gRZUYigjxwJ5KmhkRIOjBkttk3GM06drYv96ERpk53F9039FgC,$2a$10$a/g0xm854nvQAuh4Ko0PYuVo70zIGSuD1g5MVkMD2ciVXKDntwtj2,"+
                "$2a$10$RT5td108sIGzIY23M4X1weksRvuydT34d3N7duu1Cd6OZMh2agOt2,$2a$10$.qd.8zD81cBQOrnzhSgWUuLYAuft2M86hfsD6siHvVTCyL0MZwfQG,$2a$10$eYDWFSzBwhQssYhpJh1UK.XMndeQtW2uTbAb3TTU5SK8q0eCHiqYG,$2a$10$6PueANimU3hlXN8j3IKX..1zWPRVnI9y1sdR1d9C/cVYYK55.ZEgC,$2a$10$j7xKdgRPgu4XtFnfjDAkdObkEuSByemURcPOpz3NuG/W5oPVLQcOC,$2a$10$ZLVe.LAKVMW66f7rvYpcNu8BlJj6cxs2zST.bLFTIHCjz6GKhA7L.,$2a$10$aJYhOZNu.bZKu6wyHy5u6uUowAr2sY4NcSn/IpQexn9nemlVZBdfa,$2a$10$Q66gF1W1WYQuigYOaXtWT.Npoz4.0Zl.OJacjvE5bVrlbbKVJQjuW,$2a$10$mV4b7hq3gpJq7cwaiLUJ8OBnu1bOopWyeTuk8aCID6WzlaM3TuoEy,$2a$10$rkSIXEFmcmSOHs0eIc16Ous0gC83P3uIg9EV1vqkw3G9YysKKRof6,"+
                "$2a$10$LxyHFhCGKN85FYn4I3s/yeVxaEV4Q4zutHpQMiaYFTO/m.neAJ2eK,$2a$10$RmdiQrErmW4T1H91bARr3eOb/5EeJdGElP1VPKbplOKBi8VK1PZ1O,$2a$10$6Sc/VvEvcxhAIgH7kUY60.QlM4xU2eHKFxdxXBsQmMZzis4GY2buS,$2a$10$G9FBv5rBu/stjHXImxETgukeTIK2DC65x9m3Ogd91UR8/7L/WhX9W");
        String[] split = str.split(",");
        //私钥
        String privateKey = privateKeyStr;
        for (String s : split) {
            //解密字符串
            String decryptText = SM2Encryptor.decryptText(privateKey, s);
            System.out.println("解密后密码:"+decryptText);
        }

    }

    /**
     * 获取sm2密钥对,
     *
     * @return 返回String[];第0个为公钥,第1个为私钥
     * @throws Exception
     */
//	@Bean
    public void startGenerateKeyPair() throws Exception {
        try {
            Keypair keypair = Sm2.generateKeyPairHex();
            String[] result = new String[2];
            if (keypair != null) {
                result[0] = keypair.getPublicKey(); //公钥
                smKeyPair.setPublicKey(keypair.getPublicKey());
                publicKeyStr = keypair.getPublicKey();
                result[1] = keypair.getPrivateKey(); // 私钥
                smKeyPair.setPrivateKey(keypair.getPrivateKey());
                privateKeyStr = keypair.getPrivateKey();
            }
        } catch (Exception e) {
            throw new Exception("生成密钥对失败...");
        }
    }

    /**
     * RSA密钥对对象
     */
    public static class SmKeyPair {
        private String publicKey;
        private String privateKey;

        public SmKeyPair() {

        }

        public SmKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }

        public String getPublicKey() {
            return publicKey;
        }

        public void setPublicKey(String publicKey) {
            this.publicKey = publicKey;
        }

        public String getPrivateKey() {
            return privateKey;
        }

        public void setPrivateKey(String privateKey) {
            this.privateKey = privateKey;
        }
    }

}



然后运行里面的main方法获取公钥和私钥,保存起来
在这里插入图片描述
在这里插入图片描述
然后再application.yml文件中加入一个配置:
在这里插入图片描述

#SM2解密私钥
SM_privateKey: 92b704fee9ac448ac27abfa537021ab42d0035151f01fdc03e49b0c2f5496148

最后在登录接口那里调用解密方法


    /**
     * 登录方法
     * 
     * @param loginBody 登录信息
     * @return 结果
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody) throws Exception
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), SM2Encryptor.decryptText(SM_privateKey, loginBody.getPassword()), loginBody.getCode(),
                loginBody.getUuid());
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }

在这里插入图片描述
到此后端的工作就做完了

前端

前段需要先

npm i sm-crypto

在需要生成的模块,如common模块下新建一个工具类
前端代码:
在utils下新建smcrypto.js,把公钥和私钥放进来

import { sm2 } from 'sm-crypto'

const publicKey = "04b9fd451e0d0d5517069076edbc7dc83b3a885307bc8cf00185769f6818bcdf958f8dc4c8575f33dcfbe0bb18c4f651892a05a4fd923f01db2e3ad09fc4bf2878"
const privateKey = '92b704fee9ac448ac27abfa537021ab42d0035151f01fdc03e49b0c2f5496148'
const cipherMode=1

// sm2公钥加密
export function smEncryptor(password) {
  password = sm2.doEncrypt(password, publicKey, cipherMode)
  return password
}

// sm私钥解密
export function decrypt(txt) {
  return sm2.doDecrypt(txt, privateKey, cipherMode)
}

然后在登录的地方进行加密:

      const password = smEncryptor(userInfo.password)

在这里插入图片描述
最后就是测试效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE Niagara 条带粒子系列】01-初识条带渲染器

目录 效果 步骤 一、创建条带渲染器 二、增加粒子生成数量 三、设置条带粒子的初始宽度 效果 步骤 一、创建条带渲染器 1. 新建一个Niagara系统 选择“Simple Sprite Burst”模板 这里命名为“NS_RibbonRenderer” 打开“NS_RibbonRenderer”&#xff0c;删除“Sprite…

Kubernetes API 和流量控制:管理请求数量和排队进程

本文描述了我们最近遇到的一个真实案例&#xff1a;Kubernetes API 因其中一个集群中的大量请求而瘫痪。今天&#xff0c;我们将讨论我们如何处理这个问题&#xff0c;并提供一些关于如何预防它的提示。 高并发搞崩 Kubernetes API 一个非常普通的早晨&#xff0c;我们开始了…

KT148A语音芯在智能锁语音提示的优势在哪里成本还是性能

智能锁&#xff0c;已经广泛的应用于生活的各个场景&#xff0c;确实是一个好产品&#xff0c;我自己都在用&#xff0c;也很方便 而锁基本上都搭配有语音芯片或者蜂鸣器&#xff0c;低端的产品都是蜂鸣器&#xff0c;中端的产品基本都搭配语音芯片而智能锁方案中&#xff0c;…

智谱AI技术开放日:新一代基座大模型GLM-4及GLMs的发布

2024年1月16日&#xff0c;智谱AI举行了一次重要的技术开放日&#xff0c;发布了新一代基座大模型GLM-4和定制化的大模型GLMs。此次发布标志着智谱AI在人工智能领域的新一轮突破&#xff0c;进一步提升了大模型的性能&#xff0c;并降低了使用门槛&#xff0c;使得更多的人能够…

从界面探讨产品的卖点

背景 最近经常用这个平台来发布一些东西&#xff0c;总觉得体验不够好&#xff0c;毕竟这是号称是技术人员的聚集地&#xff0c;为何自己做的这个东西&#xff0c;好不好用&#xff0c;交互性咱们放到第二位&#xff0c;看了起码应该舒服&#xff0c;这应该是第一位的吧&#…

KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/3)

文章目录 1、登录kubesphere平台2、kubesphere部署应用分析2.1、工作负载2.2、服务2.3、应用路由2.4、任务2.5、存储与配置2.6、部署应用三要素 3、部署mysql3.1、mysql容器启动实例3.2、mysql部署分析3.3、创建mysql的配置3.4、创建mysql的数据卷pvc3.5、创建mysql工作负载3.6…

09- OpenCV:图像上采样和降采样

目录 1、上采样和降采样 简介 2、采样的应用场景 3、采样的API 4、图像金字塔概念 5、代码演示 1、上采样和降采样 简介 在图像处理中&#xff0c;上采样&#xff08;Upsampling&#xff09;和降采样&#xff08;Downsampling&#xff09;是常用的操作。 &#xff08;1&…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇&#xff08;Shin Tae-yong&#xff09;教练是足球界的传奇人物&#xff0c;他来到 The Sandbox&#xff0c;推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练&#xff0c;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

C:\Windows\Temp占用空间过大, 这样删除

1. windowsi, 打开windows设置, 点击系统 2. 点击存储, 点击临时文件 3. 选择你想要删除的临时文件

Abp vNext(一)说明

平时工作中使用Abp vNext框架比较多&#xff0c;但没有把文档系统的学习过&#xff0c;对于技术人员&#xff0c;不管什么框架&#xff0c;基本上拿到框架就可以着手开发了&#xff0c;都是c#语言&#xff0c;每套系统只是业务不同罢了&#xff0c;对于写业务的技术人员&#x…

【QT】自定义对话框及其调用

目录 1 对话框的不同调用方式 2 对话框QWDialogSize的创建和使用 3 对话框QWDialogHeaders的创建和使用 4 对话框QWDialogLocate的创建与使用 5 利用信号与槽实现交互操作 1 对话框的不同调用方式 在一个应用程序设计中&#xff0c;为了实现一些特定的功能&#xff0c;必须设计…

Ceph的介绍与部署

目录 存储基础 单机存储设备 DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; NAS&#xff08;网络附加存储&#xff0c;是通过网络附加到当前主机文件系统之上的存储&#xff09; SAN&#xff08;存储区域网络&#xff09; 单…

【C++】vector模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章旨在记录博主在模…

linux高级篇基础理论十二( 自动化运维工具Ansible )

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

分布式存储

1 存储基础 1.1 单机存储设备 DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机打的主板总线上去的存储&#xff09; UDE、SATA、SCSI、SAS、USB接口的磁盘 所谓的接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 NAS&#xff08;网络附加存储…

通俗易懂实现功能强大的实战项目 springboot+java+vue+mysql 日常办公用品直售推荐系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

投资自己,成就未来——社科院杜兰大学金融管理硕士项目

或许你一直在寻找一个能够提升自己、实现职业突破的机会。如果你对金融领域充满热情&#xff0c;并且渴望在这个竞争激烈的行业中脱颖而出&#xff0c;那么我要向你介绍一个绝佳的选择——中国社会科学院与美国杜兰大学金融管理硕士项目。 在这个高速发展的时代&#xff0c;投…

C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学

少年们好&#xff0c;我是博主那一脸阳光&#xff0c;我们接下来介绍C语言的调试和bug的分享。 引言&#xff1a; “如果你曾经在深夜与一串神秘莫测的C代码狭路相逢&#xff0c;彼此瞪大眼睛&#xff0c;犹如牛仔对决般紧张刺激&#xff1b;或者你曾试图驯服一段狂野不羁的循环…

C++入门案例——通讯录管理系统 控制台项目

前言 C入门案例——通讯录管理系统 & 控制台项目 目录 前言总体概览实体类设计显示页面和退出系统 添加联系人逻辑拆解相关代码 显示联系人逻辑拆解相关代码 根据名字删除联系人逻辑拆解相关代码 根据名字查找联系人逻辑拆解相关代码 修改联系人逻辑拆解相关代码 清空所有…

如何公网远程访问Axure RP制作的本地web页面【内网穿透】

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…