精华内容
下载资源
问答
  • 2021-03-24 14:32:15

    不安全的加密算法

    【SKIPJACK\RC4\RSA】(1024位以下) des、md2、md4、md5

    属于经过验证、安全的、公开的加密算法

    RSA DSA ECDSA 加入盐值的SHA256

    推荐使用的数字签名算法有:

    DSA ECDSA

    更多相关内容
  • 千万别再用了,这些加密算法

    万次阅读 多人点赞 2021-10-29 23:10:14
    CSDN博客专家????,华为云享专家????,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

    🎈 作者:Linux猿

    🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

    🎈 关注专栏:Linux 技术 (优质好文持续更新中……)🚀

    🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


    目录

    🍓一、消息摘要算法

    ✨1.1 特性

    ✨1.2 在线计算摘要

    🍓二、对称加密算法

    ✨2.1 特性

    ✨2.2 在线加解密

    🍓三、非对称加密算法

    ✨2.2 特性

    ✨2.3 在线加解密

    🍓四、不安全的加密算法

    ✨4.1 DES

    ✨4.2 3DES

    ✨4.3 md2、md4、md5

    🍓五、总结


    通常意义上,加密算法可以分为三大种类:消息摘要算法、对称加密算法和非对称加密算法。下面先来看一下这三种加密算法。

    🍓一、消息摘要算法

    消息摘要算法是将一段信息经过加密后产生一段固定长度的字符串,比如:128 位、256位长度。

    图1 消息摘要算法加密过程

    ✨1.1 特性

    (1)相同信息加密后产生的字符串相同;

    (2)具有不可逆性,不能从加密后的字符串推到出原消息;

    (3)可以用于数字签名;

    ✨1.2 在线计算摘要

    下面直接来看一个例子,如下所示:

    图2 在线计算摘要

    上图中,使用 MD5 算法对 "CSDN Linux猿" 进行了加密,可以看到,哈希值为:48e93a303a9454a94697e1f86056f54a,这个哈希值具有唯一性。

    🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶

    🍓二、对称加密算法

    对称加密算法是指加密秘钥和解密秘钥都是同一个秘钥的加密算法。

    图3 对称加密算法原理

    ✨2.1 特性

    (1)只有一个密钥,既用于加密,也用于解密;

    (2)加/解密速度较快;

    ✨2.2 在线加解密

    下面直接来看一个例子,如下所示:

    图4 在线对称加解密过程

     在上图中,对明文 “CSDN Linux猿” 使用密钥“Linux”,加密算法 AES 进行了加密。在解密过程中,使用同样的密钥“Linux”进行了解密,得到了原来的明文,这就是对称加密算法加解密原理。

    🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶

    🍓三、非对称加密算法

    非对称加密算法是指加密秘钥和解密秘钥不是同一个秘钥的加密算法。

    图5 非对称加密算法

    ✨2.2 特性

    (1)有两个秘钥,公钥用于解密,私钥用于加密,私钥一般不公开;

    (2)信息经过公钥加密后,私钥能够解密,获取原消息;

    (3)加/解密速度较慢;

    ✨2.3 在线加解密

    下面直接来看一个例子,如下所示:

    首先,需要生成公钥和私钥,分别用于加密和解密,公钥如下所示:

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1ZNOaC++tCgxjKRK/k84
    +h7klSMgrLi4efoZ+ib5ASKdvXVCpc/Nah/smTJcjztOjgWp4cesVWuqH92m0zlq
    PySFcMSDN3/RydBuUbQjisOqmQrY+4VEs0R+eVs2BuPJkfDnqP+LKk7Act56NqkO
    X9KoY4OV3Mqa8t2Os7vRBy+E2SdJeAvFEANVrv8FipXk8omxdNiixho4A7tKLEdM
    uI9BMTPGsz97S9OGwTli6XNjjU5mkMChr6G6XbRvewWh7W8K7JboDoqLn5xVWyp4
    D1HwhKipE0B1+nl84p1tS6evhybJflBIYtCU01skMWm2+4/r2IHUwjDLQ7CnYP6J
    cQIDAQAB
    -----END PUBLIC KEY-----

    私钥如下所示: 

    -----BEGIN PRIVATE KEY-----
    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDVk05oL760KDGM
    pEr+Tzj6HuSVIyCsuLh5+hn6JvkBIp29dUKlz81qH+yZMlyPO06OBanhx6xVa6of
    3abTOWo/JIVwxIM3f9HJ0G5RtCOKw6qZCtj7hUSzRH55WzYG48mR8Oeo/4sqTsBy
    3no2qQ5f0qhjg5Xcypry3Y6zu9EHL4TZJ0l4C8UQA1Wu/wWKleTyibF02KLGGjgD
    u0osR0y4j0ExM8azP3tL04bBOWLpc2ONTmaQwKGvobpdtG97BaHtbwrslugOiouf
    nFVbKngPUfCEqKkTQHX6eXzinW1Lp6+HJsl+UEhi0JTTWyQxabb7j+vYgdTCMMtD
    sKdg/olxAgMBAAECggEAHJLYqpe4q+G0v1w7rEptFQmNC2bnuDP+elM7pnwQVFaN
    RAusHwLuOISM4vIZ8A+/MsEPOWW9aLA+0oSVDS1hSZFZSP0BkStIpfd8yvGOz8Hd
    0Rvia8QorNM9GH9bexB+p0fTtoh51e8zUCrzrtxvT+KfJLE2G5P/pv59WQ6HqK40
    J60x8XVJg1lngDO518LL1EIFR3/UNkyN3F1inw2CDwBAfvxSR4wTxYkGSQBbRzrK
    NROfXkYKpvWJfdG0UM7c1MZPNpUsN8izkxRUN2viNvWW3JCJvI+UFjld7PPyxxwM
    5mQ7MM+/e1ozhmUvUJ1FgfqVgs7cDRAS6onn+R7xAQKBgQD41PbKDbIU/W1AIC0q
    0p+ERNFtFCUJ1naI4jr8v1vFxCrJ6P3kDBWzYPArG6XBcuAHqDPhw0ExDTTOw1rQ
    +PNgDNN6VUMp6mujuYNucYlqsMtl0IYPpBWjqNWToNKi/zeFThFIdOOwVkWUReN3
    +7qsHrIFRqR7H/kkvNc+JQcbZwKBgQDbulb9lg04skR7lX/PK+ogeP6HXq8NFA4S
    11zUEdJEuIeEYnbIYSNgoSvjh3wl6ckKJaJUoW1tc7RhsdkW9dUhEgjDImkmZ7bd
    vqAp1vCncmKidzBuEt247Fek3jvZZEwTunPSpDMgIjdqHKEVJl4L0acGaY/WA/cv
    F8JyfSqFZwKBgERy8OBsHAzCGgeF0mbxQYg1FhcXb4jhQgItmWRlj207pTmdqhnN
    aTrK88Yn+NTaMN5qWrtD5u8DXv9xpc3ObcSCQrpoMe2Z2rpTEeCTwuVidNExJ2+u
    B3XZv8a4erjz0+YLr51q6idb1BARmZ0r1hH676Wb5SsphHOiruMddHMJAoGBANEM
    qFb7u/iFIsKxqbfhgA8FDqScYM+AlSM34wmhKvxW1BgP1hMu2AnHTYpcDLHFi5Ar
    3hXGv+Wyf5uzKWe+29dq4QtGYeQ4KLMv+hHUfYHSQiVwYJNZP7oAoiIpjad21Sqv
    6iIuNrYL180ND/SfXDrCbLadGEv12ebkJAvpKdthAoGAMROodRdek5W85EyK70WT
    WKBLb4X1+KRqjqmNCnv7LYJe4IMiX+hQ8t5yBgQbGtnD/s7KR9nkrfdPqnY1zoLC
    6Fg8A0ngNTWQAMjAjkGTWbwF5dfnJrYNthmAJtjbdvYEejYTQrfe+o8sgVehFJFk
    rAfPXxAuzK+o4m5vSivrAnY=
    -----END PRIVATE KEY-----
    

     使用公钥对 “CSDN Linux猿”,加密算法 RSA 进行加密,如下所示:

     使用私钥对加密后的数据进行解密,如下所示:

    上图中,将密文解密为 “CSDN Linux猿”。

     

    🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶

    🍓四、不安全的加密算法

    下面就来看一下哪些加密算法不建议再使用了。

    ✨4.1 DES

    DES 是数据加密标准(Data Encryption Standard)的缩写,是一种对称密钥加密算法。

    1976年美国联邦政府将其确定为国家标准。但是,在1999年1月,distributed.net 与电子前哨基金会合作,在22小时15分钟内公开破解了一个 DES 密钥。

    注意:通常说的加密算法被破解,一般是该加密算法有一组或几组密钥能在有限的时间内找到解,并不是说加密算法完全不能用了。

    ✨4.2 3DES

    3DES 是三重数据加密算法(Triple Data Encryption Algorithm)的缩写,是一种对称加密算法。

    从名称就可以知道,DES 和 3DES 有一定关系,3DES 比 DES 安全强度更高,3DES 是对每个数据块应用三次 DES,具有三个独立密钥。

    但是,在 2017 年 3DES 已被 NIST 弃用,自 OpenSSL 1.1.0 版 起,默认不包含 3DES,并将其视为“弱密码”。

    ✨4.3 md2、md4、md5

    从名称上来看,md2、md4、md5 显然是一个系列,MD 是 Message-Digest Algorithm 的简写,是一种信息摘要算法,也称为哈希算法,具有不可逆性。

    但是,在 2009年,中国科学院谢涛和冯登国仅用了 2^20.96 的碰撞算法复杂度,破解了 MD5 的碰撞抵抗。2011年,RFC 6151 禁止 MD5 用作密钥散列消息认证码。

    🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶

    🍓五、总结

    尽量避免过时/不安全/被遗弃的加密算法的使用,后面将会讲解推荐使用的加密算法。

    ⚡参考文献⚡

    [1] 在线RSA加密解密,RSA2加密解密(SHA256WithRSA)-BeJSON.com

    [2] 在线加密解密

    欢迎关注下方👇👇👇公众号👇👇👇,获取更多优质内容🤞(比心)!

    展开全文
  • 静态扫描规则:不安全加密算法

    千次阅读 2022-03-07 18:03:43
    今天使用一款SAST扫描不安全加密算法时,发现一个很明显的代码段,居然没有扫描到,代码段如下: private static void testdes() { try { //Creating a KeyGenerator object KeyGenerator keyGen = ...

    今天使用一款SAST扫描不安全的加密算法时,发现一个很明显的代码段,居然没有扫描到,代码段如下:

    private static void testdes()  {
    		try {
    			//Creating a KeyGenerator object
    			KeyGenerator keyGen = KeyGenerator.getInstance("des");
    
    			//Creating a SecureRandom object
    			SecureRandom secRandom = new SecureRandom();
    
    			//Initializing the KeyGenerator
    			keyGen.init(secRandom);
    
    			//Creating/Generating a key
    			Key key = keyGen.generateKey();
    
    			System.out.println(key);
    			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    			cipher.init(cipher.ENCRYPT_MODE, key);
    
    			String msg = new String("Hi how are you");
    			byte[] bytes = cipher.doFinal(msg.getBytes());
    			System.out.println(hex(bytes));
    
    		} catch (NoSuchAlgorithmException e){
    			e.printStackTrace();
    		} catch (BadPaddingException e) {
    			e.printStackTrace();
    		} catch (IllegalBlockSizeException e) {
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			e.printStackTrace();
    		} catch (InvalidKeyException e) {
    			e.printStackTrace();
    		}
    
    	}

    代码中使用的DES算法,查了一下Oracle的官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest

     发现里面的算法全是大写的。 根据代码,初步判断可能是大小写导致的。

    于是,将代码中的小写的des改成大写的DES,再扫描一次,发现扫描出来了。其他的算法,例如:MD5,SHA1,DESede,还有HmacMD5和等,都写代码测试了一下,无论是大写,还是小写,都可以运行,而且结果也都是一样的。测试代码如下:

    public static void main(String[] args) {
    		testMD5();
    		testmd5();
    		testSHA1();
    		testSHA_1();
    		testdes();
    		testDES();
    		testMacSHA1();
    		testMacMD5();
    		SpringApplication.run(LargestApplication.class, args);
    	}
    
    	private static void testmd5() {
    		try {
    			MessageDigest md5 = MessageDigest.getInstance("md5");
    			String data = "test";
    			md5.update(data.getBytes());
    			byte result[] = md5.digest();
    			System.out.println("md5 result is " + hex(result));
    		} catch (NoSuchAlgorithmException e){
    			e.printStackTrace();
    		}
    
    	}
    
    	private static void testMD5()  {
    		try {
    			MessageDigest md5 = MessageDigest.getInstance("MD5");
    			String data = "test";
    			md5.update(data.getBytes());
    			byte result[] = md5.digest();
    			System.out.println("MD5 result is "+hex(result));
    		} catch (NoSuchAlgorithmException e){
    			e.printStackTrace();
    		}
    
    	}
    
    	private static void testSHA1()  {
    		try {
    			MessageDigest md5 = MessageDigest.getInstance("sha1");
    			String data = "test";
    			md5.update(data.getBytes());
    			byte result[] = md5.digest();
    			System.out.println("sha1 result is "+hex(result));
    		} catch (NoSuchAlgorithmException e){
    			e.printStackTrace();
    		}
    
    	}
    
    	private static void testSHA_1()  {
    		try {
    			MessageDigest md5 = MessageDigest.getInstance("sha-1");
    			String data = "test";
    			md5.update(data.getBytes());
    			byte result[] = md5.digest();
    			System.out.println("sha-1 result is "+hex(result));
    		} catch (NoSuchAlgorithmException e){
    			e.printStackTrace();
    		}
    
    	}

    需要关注的一个地方是:SHA1这个加密算法,无论使用SHA1,还是SHA-1,都可以正常运行,在制定扫描策略的时候,就都需要考虑到。否则,就会导致漏网之鱼。

    最后要说的一点是,即使有不同的写法,也都能正常运行,还是建议按照官方文档给出的建议来写,不容易造成困惑。

    展开全文
  • 加密算法-密码安全

    千次阅读 2022-02-12 10:18:19
    摘要是哈希值,我们通过散列算法比如MD5算法就可以得到这个哈希值。摘要只是用于验证数据完整性和唯一性的哈希值,不管原始数据是什么样的,得到的哈希值都是固定长度的。 不管原始数据是什么样的,得到的哈希值都是...

    密码安全

    摘要加密

    摘要是哈希值,我们通过散列算法比如MD5算法就可以得到这个哈希值。摘要只是用于验证数据完整性和唯一性的哈希值,不管原始数据是什么样的,得到的哈希值都是固定长度的。 不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说摘要并不是原始数据加密后的密文,只是一个验证身份的令牌。所以我们无法通过摘要解密得到原始数据。

    MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函 数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由 美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套 算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于 需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞 (collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。 MD5存在一个缺陷,只要明文相同,那么生成的MD5码就相同,于是攻击者就可以通过撞库的方式 来破解出明文。加盐就是向明文中加入指定字符,主要用于混淆用户、并且增加MD5撞库破解难度,这样一来即使撞库破解,知道了明文,但明文也是混淆了的,真正需要用到的数据也需要从明文中摘取, 摘取范围、长度、摘取方式都是个谜,如此一来就大大增加了暴力破解的难度,使其几乎不可能破解。

    摘要加密算法

    1. MD5算法法(MD2 、MD4、MD5)
    2. SHA算法(SHA1、SHA256、SHA384、 SHA512)
    3. HMAC算法

    特点

    1. 任何数据加密,得到的密文长度固定。
    2. 密文是无法解密的(不可逆)。

    验签

    验签其实就是签名验证,MD5加密算法经常用于签名安全验证。疑问:要是密文也一起改了再传过去呢?

    代码示例

    import org.apache.commons.codec.digest.DigestUtils;
    
    public class MD5Util {
    
        /**
         * MD5方法
         *
         * @param text 明文
         * @return 密文
         * @throws Exception
         */
        public static String md5(String text) throws Exception {
            //加密后的字符串
            String encode = DigestUtils.md5Hex(text);
            return encode;
        }
    
        /**
         * MD5方法
         *
         * @param text 明文
         * @param key  盐
         * @return 密文
         * @throws Exception
         */
        public static String md5(String text, String key) throws Exception {
            //加密后的字符串
            String encode = DigestUtils.md5Hex(text + key);
            return encode;
        }
    
        /**
         * MD5验证方法
         *
         * @param text 明文
         * @param key  密钥/盐
         * @param md5  密文
         * @return true/false
         * @throws Exception
         */
        public static boolean verify(String text, String key, String md5) throws Exception {
            //根据传入的密钥进行验证
            String md5Text = md5(text, key);
            return md5Text.equalsIgnoreCase(md5);
        }
    
        public static void main(String[] args) throws Exception {
            String test = "admin";
            String key = "tiger";
            String md5 = "bcf918bd662986b3bcab0f9a32a21e1d";
            String md5Str = md5(test, key);
            System.out.println(md5Str);
            boolean passOrNot = verify(test, key, md5);
            System.out.println(passOrNot);
        }
    }
    

    Base64

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印 字符来表示二进制数据的方法。

    解决编码问题

    代码示例

    import java.util.Base64;
    
    public class Base64Util {
    
        /***
         * 普通解密操作
         * @param encodedText:密文
         * @return
         */
        public static byte[] decode(String encodedText) {
            final Base64.Decoder decoder = Base64.getDecoder();
            return decoder.decode(encodedText);
        }
    
        /***
         * 普通加密操作
         * @param data
         * @return
         */
        public static String encode(byte[] data) {
            final Base64.Encoder encoder = Base64.getEncoder();
            return encoder.encodeToString(data);
        }
    
        /***
         * 解密操作
         * @param encodedText
         * @return
         */
        public static byte[] decodeURL(String encodedText) {
            final Base64.Decoder decoder = Base64.getUrlDecoder();
            return decoder.decode(encodedText);
        }
    
        /***
         * 加密操作
         * @param data
         * @return
         */
        public static String encodeURL(byte[] data) {
            final Base64.Encoder encoder = Base64.getUrlEncoder();
            return encoder.encodeToString(data);
        }
    
        public static void main(String[] args) throws Exception {
            String str = "今天的饭真好吃啊!明天还来!";
    
            // 加密
            String encode = encode(str.getBytes("UTF-8"));
            // 解密
            byte[] decode = decode(encode);
            // 字节数组 -》字符串
            String text = new String(decode, "UTF-8");
            System.out.println("密文:" + encode);
            System.out.println("明文:" + text);
    
            // URL
            // 加密
            String encodeURL = encodeURL(str.getBytes("UTF-8"));
            // 解密
            byte[] decodeURL = decodeURL(encodeURL);
            // 字节数组 -》字符串
            String textURL = new String(decodeURL, "UTF-8");
            System.out.println("密文:" + encodeURL);
            System.out.println("明文:" + textURL);
        }
    }
    

    对称加密AES

    典型的对称加密算法有AES、DES、3DES,但AES加密算法的安全性要高于DES和3DES,所以AES 已经成为了主要的对称加密算法。

    AES加密算法就是众多对称加密算法中的一种,它的英文全称是Advanced Encryption Standard, 翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。 要理解AES的加密流程,会涉及到AES加密的五个关键词,分别是:分组密码体制、Padding、密 钥、初始向量IV和四种加密模式

    代码示例

    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Security;
    
    public class AESUtil {
    
        /**
         * AES加密/解密
         *
         * @param buffer:密文/明文
         * @param secretKey:秘钥
         * @param mode:加密/解密模式 1 加密  2 解密
         * @return
         */
        public static byte[] encryptAndDecrypt(byte[] buffer, String secretKey, Integer mode) throws Exception {
            // 1、加载加密解密算法处理对象(包含算法、秘钥管理)
            Security.addProvider(new BouncyCastleProvider());
    
            // 2、根据不同算法创建秘钥   1)秘钥的字节数组   2)加密算法
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");
    
            // 3、设置加密模式(无论是加密还是解析,模式一致)
            //   1)、AES/ECB/KPS7Padding 设置算法
            //   2)、指定算法库对象
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
            // 4、初始化加密配置
            cipher.init(mode, secretKeySpec);
            // 5、执行加密/解密
            return cipher.doFinal(buffer);
        }
    
        /***
         * 加密解密测试
         * 密钥:128(16)、192(24)、256(32)
         */
        public static void main(String[] args) throws Exception {
            // 明文
            String plainText = "SpringCloud Alibaba";
            // 128bit 16位密钥
            String secretKey = "1234567890123456";
            // 将128bit 16位密钥 -》 256bit 32位密钥
            secretKey = MD5Util.md5(secretKey);
            System.out.println("明文:" + plainText);
            System.out.println("密钥:" + secretKey);
    
            // 加密
            byte[] bytes = encryptAndDecrypt(plainText.getBytes("UTF-8"), secretKey, 1);
            // 编码
            String encodeStr = Base64Util.encode(bytes);
            System.out.println("密文:" + encodeStr);
    
            //解密 ->解码Base64->解密
            byte[] decodeStr = encryptAndDecrypt(Base64Util.decode(encodeStr), secretKey, 2);
            System.out.println("解密后数据:" + new String(decodeStr, "UTF-8"));
        }
    }
    

    微信支付-Native

    接口文档

    https://pay.weixin.qq.com/wiki/doc/api/index.html

    流程说明

    1. 商户后台系统根据用户选购的商品生成订单。
    2. 用户确认支付后调用微信支付【统一下单API】生成预支付交易;
    3. 微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
    4. 商户后台系统根据返回的code_url生成二维码。
    5. 用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
    6. 微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
    7. 用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
    8. 微信支付系统根据用户授权完成支付交易。
    9. 微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
    10. 微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
    11. 未收到支付通知的情况,商户后台系统调用【查询订单API】。
    12. 商户确认订单已支付后给用户发货。

    开发步骤

    1. 过修改官方wxpay-sdk源码,将抽象方法的修饰符从默认修改为public, 然后重新打包到本地或者私服

      import com.github.wxpay.sdk.IWXPayDomain;
      import com.github.wxpay.sdk.WXPayConfig;
      import com.github.wxpay.sdk.WXPayConstants;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.stereotype.Component;
      
      import java.io.ByteArrayInputStream;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.InputStream;
      
      @Component
      public class WeixinPayConfig extends WXPayConfig {
      
          //微信支付信息
          @Value("${payconfig.weixin.appId}")
          private String appId;       //应用ID
          @Value("${payconfig.weixin.mchID}")
          private String mchID;       //商户号
          @Value("${payconfig.weixin.key}")
          private String key;         //秘钥
          @Value("${payconfig.weixin.notifyUrl}")
          private String notifyUrl;   //回调地址
          @Value("${payconfig.weixin.certPath}")
          private String certPath;    //证书路径
          //证书字节数组
          private byte[] certData;
      
          @Override
          public String getAppID() {
              return this.appId;
          }
      
          @Override
          public String getMchID() {
              return this.mchID;
          }
      
          @Override
          public String getKey() {
              return this.key;
          }
      
          /***
           * 获取商户证书内容
           * @return
           */
          @Override
          public InputStream getCertStream() {
              /****
               * 加载证书
               */
              if (certData == null) {
                  synchronized (WeixinPayConfig.class) {
                      try {
                          if (certData == null) {
                              File file = new File(certPath);
                              InputStream certStream = new FileInputStream(file);
                              this.certData = new byte[(int) file.length()];
                              certStream.read(this.certData);
                              certStream.close();
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }
              ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
              return certBis;
          }
      
          /***
           * 获取WXPayDomain, 用于多域名容灾自动切换
           * @return
           */
          @Override
          public IWXPayDomain getWXPayDomain() {
              // 这个方法需要这样实现, 否则无法正常初始化WXPay
              IWXPayDomain iwxPayDomain = new IWXPayDomain() {
                  @Override
                  public void report(String domain, long elapsedTimeMillis, Exception ex) {
      
                  }
      
                  @Override
                  public DomainInfo getDomain(WXPayConfig config) {
      
                      return new DomainInfo(WXPayConstants.DOMAIN_API, true);
                  }
              };
              return iwxPayDomain;
          }
      }
      
    2. 微信支付\证书和秘钥中的证书以及秘钥配置导入到 mall-pay-service 工程中,如果是php开发,采用pem证书,如果是java开发采用p12证书

    3. 创建 WXPay 的实例并交给Spring容器管理

      import com.github.wxpay.sdk.WXPay;
      import com.gupaoedu.vip.mall.pay.config.WeixinPayConfig;
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.Bean;
      
      @SpringBootApplication
      @MapperScan(basePackages = {"com.tiger.mall.pay.mapper"})
      public class MallPayApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(MallPayApplication.class, args);
          }
      
          /****
           * 微信支付SDK对象
           * @param weixinPayConfig
           * @return
           * @throws Exception
           */
          @Bean
          public WXPay wxPay(WeixinPayConfig weixinPayConfig) throws Exception {
              return new WXPay(weixinPayConfig);
          }
      }
      

    微信退款

    展开全文
  • 不安全加密算法有哪几种

    千次阅读 2020-12-20 21:51:41
    不安全加密算法有以下几种:1、DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。2、3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。3、AES...
  • 加密算法总结

    千次阅读 2022-02-27 20:12:16
    加密算法,密码学
  • 常见的几种安全加密算法

    千次阅读 2017-11-17 10:58:12
    本文整理了常见的安全算法,包括MD5、SHA、DES、AES、RSA等,并写了完整的工具类(Java 版),工具类包含测试,大家可以放心使用。一、数字摘要算法 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定...
  • 1、常用的加密算法分类 常见的加密算法可以分成五类: 对称加密算法、非对称加密算法和、Hash 算法(也称摘要算法)、数字签名(Hash&RSA)和数字证书(Hash&RSA&CA)。 1)对称加密算法...
  • 安全架构-加密算法-对称加密

    千次阅读 2020-12-21 21:50:03
    安全架构-加密算法-对称加密 本系列安全架构文章中,之前谈到了api接口签名防止数据篡改,但是关键数据在通讯过程中是能明文传递的,这就涉及到另外的安全问题,数据加密传输。 加密算法根据加密秘钥的不同分为...
  • 一、概要 可逆 对称加密 1. DES(Data Encryption Standard):数据加密标准 ...二、可逆算法(哈希HASH) 1、MD5加密 MD5加密的特点: 可逆运算 对不同的数据加密的结果是定长的32位字符(不管文件多大都一样)
  • 数据安全及各种加密算法对比

    万次阅读 2018-06-22 11:55:40
    然而市场上存在着各种各样的抓包工具及解密算法,甚至一些公司有专门的逆向部门,这就加大了数据安全的风险,本文将通过以下几个方面对各种加密算法进行分析对比:Base64编码(基础)单项散列函数 MD5、SHA1、SHA256...
  • 加密算法安全性和特点

    千次阅读 2020-08-17 16:45:10
    加密算法安全
  • 深入浅出安全加密算法

    千次阅读 2019-06-20 14:16:55
    DES加密算法: DES加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法。DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的...
  • 世界上迄今为止最安全加密算法

    千次阅读 2019-11-28 21:58:00
    全世界只有3.14 %的人关注了青少年数学之旅一个只能用算力来破解的加密算法1人类的加密史公元前5世纪,古希腊人使用一根叫scytale的棍子来传递加密信息。要加密时,先绕棍子卷一张纸...
  • 摘要算法和加密算法

    千次阅读 2022-04-01 14:04:16
    概要算法和加密算法的讲解与比较
  • 非对称加密算法的加密密钥和解密密钥相同,并且从其中一个很难退出推导出另外一个。 对称加密优缺点: 优点 1、加解密效率高,适合加密大量数据 2、密钥相对比较短 3、硬件容易实现 缺点 1、需要以安全方式进行...
  • 如果 Web 服务中的 SSL协议出现安全问题, 攻击者就可以拥有你所有的安全信息。...编辑配置文件nginx.conf,把这句加在 server 配置节里就可以了,在浏览器使用不安全算法时,会自动禁止连接。
  • 公开密钥加密算法

    千次阅读 2021-05-22 22:43:57
    常见的公钥加密算法有: RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法(Elliptic Curve Cryptography, ECC);DSA数字签名(又称公钥数字签名),将...
  • 安全性要求高的应用程序必须避免使用不安全的或者强度弱的加密算法,现代计算机的计算能力使得攻击者通过暴力破解可以攻破强度弱的算法。例如,数据加密标准算法DES是极度不安全的,使用类似EFF(Electronic ...
  • 例如,我们测试软件层以及系统层的时候,会关注一些加密算法以及该密码或敏感数据是否加密或加密后又如何解析,它们又存放在哪个位置等等。 例如,Android设备(也可以是手机,也可以是智能大屏等)解锁屏幕时输入的...
  • 加密算法及应用总结

    千次阅读 2020-09-01 13:03:22
    也就是说我们通常假设攻击者对加密算法和密文了如指掌,因此加密的安全性应该仅仅依赖于密钥而不是依赖于假设攻击者知道加密算法。 在如今的信息安全领域,有各种各样的加密算法凝聚了计算机科学家门的智慧。从...
  • 常见的可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法安全性要比MD5更高,而SHA2加密算法比SHA1的...
  • RSA非对称(公钥)密码算法的Python实现【物联网安全】【信息安全
  • 加密算法有哪些?

    千次阅读 2021-04-20 12:10:25
    一、对称加密算法 1、DES 已破解,不再安全,基本没有企业在用了。 是对称加密算法的基石,具有学习价值。 密钥长度56(JDK)、56 / 64(BC) 2、DESede(三重DES) 早于 AES 出现来替代 DES 。 计算密钥时间...
  • 什么是 AES-GCM加密算法

    千次阅读 2018-03-01 14:55:31
    AES是一种对称加密算法,它的相关概念在此赘述。GCM ( Galois/Counter Mode) 指的是该对称加密采用Counter模式,并带有GMAC消息认证码。在详细介绍AES-GCM之前,我们先了解一些相关概念。下文中出现的符号:Ek使用...
  • 五种对称加密算法总结

    千次阅读 2021-09-08 13:49:26
    是对称加密算法的基石,具有学习价值 密钥长度56(JDK)、56/64(BC) 2、DESede(三重DES) 早于AES出现来替代DES 计算密钥时间太长、加密效率高,所以也基本上不用 密钥长度112/168(JDK)、128/192(BC) 3、...
  • 对称加密与非对称加密算法

    千次阅读 2022-01-24 16:25:55
    1.2、对称加密算法 1.2.1、DES 1.2.2、3DES 1.2.4、AES 1.2.5、SM1 1.2.6、SM4 1.2.7、RC2 1.2.8、RC4 1.2.9、RC5 说明 2、非对称加密 2.1、非对称加密算法 2.1.1、RSA 2.1.2、ECC 2.1.3、SM2 3、...
  • AES加密算法

    千次阅读 2021-04-20 10:26:08
    上一节介绍的3DES,实际上只是DES的一个变体,他通过三重加密的方式保障了安全性,但是随之而来的巨大的计算量消耗,带来的就是加解密速度慢,效率高的问题。 为了解决这个问题,美国NIST早在1997年就发布了公开...
  • 常用的加密算法

    千次阅读 2021-02-11 09:21:48
    常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法...对称加密算法安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是可能的,他们通常会有意无意的把密钥泄漏出...
  • HE) 是指满足密文同态运算性质的加密算法,即数据经过同态加密之后,对密文进行特定的计算,得到的密文计算结果在进行对应的同态解密后的明文等同于对明文数据直接进行相同的计算,实现数据的“可算可见”。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 207,722
精华内容 83,088
关键字:

不安全的加密算法

友情链接: kingcms1.rar