在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密。比如对接支付宝、微信开放平台时,需要配置公钥并下载平台的公钥,后续调用方就需要对请求的报文进行签名,支付宝、微信收到请求后需要验签,只有身份验证通过才能执行相关的业务流程。

在实际的开发过程中,有很多人分不清什么是公钥什么是私钥,如何进行签名验签及加密解密,以及签名验签与加密解密有什么关系。这一期我们就来详细说说这个问题。关于RSA的算法请参考我的文章《安全系列之——RSA的前世今生》,加密解密可以参考我的文章《安全系列之——手写JAVA加密、解密》。

一、公钥私钥

在之前的文章《安全系列之——手写JAVA加密、解密》中,介绍了对称加密和非对称加密。其中非对称加密使用的是RSA算法,所谓的非对称,指的是,加密时使用的秘钥和解密时使用的秘钥是不一样的。也就是说RSA有一对秘钥,其中一个是公钥,另一个是私钥,一个用于加密,一个用于解密。

RAS算法的两个应用是签名验签、加密解密。

在网络通讯过程中,通讯之前,调用方和被调用方都需要生成一对公私钥;然后调用方和被调用方之间交换公钥;这样调用方和被调用方都拥有自己的私钥和对方的公钥,这是双方通讯为了通讯安全就可以做签名验签和加密解密了。

私钥只能自己拥有,不能暴露给任何人,只要私钥不暴露,通讯就是安全的。私钥可以等同于身份。

公钥可以被任何人获取。获取到对方的公钥,就可以通过公钥验证对方的签名;同时使用对方的公钥加密,也只能被对方的私钥解密。

因为公钥是公开的,也为通讯双方的公钥交换提供了便利,不用在考虑交换时是否泄漏了。

二、签名验签与加密解密的关系

首先强调一点,签名验签与加密解密之间没有关系。

签名验签与加密解密都是为了系统安全而做的必要措施,但是是为了防范不同的安全风险。

签名验签

签名验签:是为了验证用户身份是否是合法。比如微信支付,任何合法的商户都可以调用微信支付接口。那么什么是合法商户呢?满足微信的很多要求,比如商户注册微信商户平台获得商户id、签约相关的支付产品获得appid、给开通的支付产品配置商户的公钥并下载微信的公钥,这样的商户对微信来说才是合法的。然后商户使用自己的商户私钥对相关的请求参数进行签名后调用微信的支付接口;微信收到请求后通过商户配置在平台的商户公钥对这个请求进行验签,验签通过说明这个次请求时一个合法的平台商户发起的,验签通过后就可以做具体的支付业务了。

签名为什么用调用方的私钥?签名通常是被调用方(平台)考虑到自身安全要求调用方做签名,从而验证调用方是否合法。考虑的是被调用方的安全。因为合法的商户已经将自己的公钥配置到微信后台了,当一个调用者将加签名的参数传到微信平台,而微信平台恰好能用这个商户配置的公钥验签通过,说明发请求的人就是持有这个私钥的合法商户,因为只有持这个私钥的商户才能做出这个签名,私钥是保密的,不是每个人都有。如果签名使用的是公钥,公钥人人都可以从网上获取,一个非法的调用者也可以获得这个公钥并签名向微信发请求,即使微信平台验签通过也不知道这个调用者是否合法。

加密解密

加密解密:是为了防止数据在网络传输中被人劫持。假如商户调用微信的支付接口时,请求报文中的有很多敏感字段比如银行卡号、密码等(实际不需要这些字段),当报文在网络上传输时,被人恶意监听,就会导致商户的银行卡号和密码泄露,所以商户在调用时就需要使用微信公钥对整个报文进行加密;微信收到请求后,就可以使用微信私钥进行解密,这样就可以防止敏感信息泄露了。当然https已经在传输的时候加密了。

加密为什么用对方的公钥?加密通常是调用方(商户)考虑自身安全,保证调用方的敏感信息不被泄露而做的,保证只有真正的被调用方才能解密。如何保证呢?也就是即使信息在网络传输中被劫持了,也不能解密。要想解密,必须持有秘钥,要想唯一持有秘钥,那就必须是私钥,因为私钥是不对外公开的。能解密,说明这个信息就是发生给他的。所以,信息发给谁,就只能用谁的私钥才能解密,这就必须要求发送方使用他的公钥加密了。信息要发给微信平台,就必须用微信平台的公钥加密。

这里签名验签与加密解密使用的是不同的公私钥。签名时,站在被调用方(微信平台)的角度看,微信要求谁调用微信平台,谁使用自己的私钥做签名;解密时,站在调用方(商户)的角度看,商户把信息发给谁,谁才能使用自己的私钥解密。因为私钥只有自己持有,私钥可以和合法用户划等号。而公钥是全网公开的,谁都能获取。

总结:

签名:A调用B时,B要验证A是否合法(是否能调用接口),A必须使用自己的私钥签名;
解密:A调用B时,A要验证B是否合法(是否能解密),B必须使用自己的私钥解密;

三、测试

这里模拟A给B发消息的过程,测试前,A生成一对公私钥,B生成一对公私钥,然后A和B交互公钥,A拥有 privateKey_A 和publicKey_B,B拥有privateKey_B和publicKey_A。这里只模拟单向(A请求B)的签名验签和加密解密,有兴趣的可以自己模拟双向的(A请求B,以及B响应A)签名验签和加密解密。

关于公私钥的生成可以参考之前的文章《安全系列之——手写JAVA加密、解密》。关注公众号,输入关键字“java-summary”,即可获得源码。

 ​/*** Description:** @author 诸葛小猿* @date 2020-08-21*/@Slf4jpublic class SignAndEncryptTest {​public static final String  SIGN_ALGORITHMS = "SHA1WithRSA";public static final String CHATSET = "utf-8";​public static String publicKey_A = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnen01CdQc2zh/HihCNNYI6u7AFXf/NrZ/9auPvFsJcK1cWj5EFBU3lrts2OTvrmYVurhABg2g/Ya7glzUt6DwUojHOWtpwFxSH1v7FUJMvxDsbd4GXKRdWqMkqkcCMQYDpGpshbL3IAWYIw6pgnBcKksbzkDrZCZMAyHa1bB3zh5uEm9mcrRlBUGirbPNVt++3ztIfdc4Vp5hbw++daNMFr/VGDohMVg3Dlk4ZktDgHc5nakXkE8hSr6UDTw45JpfZZ0dP9XTi/CSVQdoYD+dsJIZ8uletlbrErRfZEJNx/k0w88P4kfGteNBGhlzzVo45tMkHT33O8QB6JxI4xVQIDAQAB";public static String privateKey_A = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCyd6fTUJ1BzbOH8eKEI01gjq7sAVd/82tn/1q4+8WwlwrVxaPkQUFTeWu2zY5O+uZhW6uEAGDaD9hruCXNS3oPBSiMc5a2nAXFIfW/sVQky/EOxt3gZcpF1aoySqRwIxBgOkamyFsvcgBZgjDqmCcFwqSxvOQOtkJkwDIdrVsHfOHm4Sb2ZytGUFQaKts81W377fO0h91zhWnmFvD751o0wWv9UYOiExWDcOWThmS0OAdzmdqReQTyFKvpQNPDjkml9lnR0/1dOL8JJVB2hgP52wkhny6V62VusStF9kQk3H+TTDzw/iR8a140EaGXPNWjjm0yQdPfc7xAHonEjjFVAgMBAAECggEAec/qIPXZIF0CuTuEXKSr38gD5NpVmuPO38EPb0uJ96pgnuCzqMxRhmRN/Qv4ojfmn3UucH7BnJVMJtoeEy39NdtTfeo3aJS963vufNTQlf0NoARk1RElKt1XudPwwQlt2ABu0M/YTV4GlxGhyb3ohKoCN76x+si0MIhurIryovyabZCtlhGD2fg3V1t8RBlCEuz68FtB9fSh4zk7u6RhAL5LCOGNbVAiY4hx/NhrDiBfvQBhJZmPG+3gWjjZFgZEH5B0tGByuG2M+dj2qT5LFepkhGyI/upJwOhJrjiRrvR7LmSYCz0lI8/2fVCF8jN/TJav/1xVR82d/165Movm0QKBgQDZv/H1bhPoCoeh8z3ww8Um5FjFb1MMjmh4oB1d2+0QlYTbSVx6mOxBoh0yk+jKztotJyWs61nnHekOhdHFx9Ij1L8oMxybBK+heTuzl2WIs9/2CRBV4XfKMwNiYxJYkaXxUgeHx/2IVXTuFMKMrWhf7kxk2iFrK+Gv63oY0dmvhwKBgQDR0TWXRXC2qEqH/NV/6d24UHl4i/+UP1aKE9jA8xArJYBlKtTWCgM7g3/wxr0IRB6RocVupop/kZJ9RUFjprfaykDOj+A0oC+IDwUmGIjGbR4P921qjWEVQGIFSJvnIwHwGfEAPxvw0uW2tqz9C2GUZ9OB17lecfIdeJQX2Hb3QwKBgA9bWCclAkZlJ7emPgIS7H6XsCMMfODv0jJfqHKMJiX7RYlpnRoQWukuE70TbWGQQRbaIfAWERsZouwhR/AY7ZsVT/33zNap9/D9adZ6oPCJLwxdC0fjRN1/x4dS0WJpszhXvqw20Iyi6kI4OJhPSoMpfT3HnH/AcoRDqTLC6gVVAoGBAI3f9GfseZHZbERV75wF7HoEWI7tw41f4smNMAUQln9GZXKDKtXsgVEN00ZhbFMZlL4O8GyoyoAGVFLGsLeMdUfJeVbzrLyJEHrlBStEbcAW6rwLJ/5jySDQnzdJaLo7TsUnFXKAOgl24gPRtFmLB5mNN1TWJS86x2esMB+LrK33AoGADEDHIUtulc4zclLH9MJj7JcZPkgVz5llJ1jQj3fOu4iPc9TNvV2gV2kWU446gyMmRrQ2We1awnrjaeSzeFnf0OhL+yTzNUmRLMYWZhja/KMhr7b9vVRCCrysZJod+MWodEH+HIJlu9RGIxv7fNNy1S4yRU92OQU43XQ1S93eaEE=";​public static String publicKey_B = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv8GjRufWGPI7Xe6caZ5h5PbnRIQVzD4P1gDjKZaibcxcApGEaqFkT3Am2U6iKv6paELuwxy+dUL1Jvbs09QljuHgDB9SV0VxSM5LscpCmWJ5P1V6Y/QiholCQHCFR6ok6oE2HWGRw/bPQWr/gHfa2zNPu+CB64cbOxLHIQYIRji47tyywAL5ABhF1msZY2vW8xaFKHGq74sxNpf8s0NUnRnVRANjHtuDa/zvrHim45gqBWg+3gPVSQyPU3ydMoj0AiORJQmqprHaZDB7BufpTEZA6I2WElsKJcsGMdwfSd1s0B1iCzrkMmT30n/XXxyw8qQGsvJvQ2V90QiAV9bV+wIDAQAB";public static String privateKey_B = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/waNG59YY8jtd7pxpnmHk9udEhBXMPg/WAOMplqJtzFwCkYRqoWRPcCbZTqIq/qloQu7DHL51QvUm9uzT1CWO4eAMH1JXRXFIzkuxykKZYnk/VXpj9CKGiUJAcIVHqiTqgTYdYZHD9s9Bav+Ad9rbM0+74IHrhxs7EschBghGOLju3LLAAvkAGEXWaxlja9bzFoUocarvizE2l/yzQ1SdGdVEA2Me24Nr/O+seKbjmCoFaD7eA9VJDI9TfJ0yiPQCI5ElCaqmsdpkMHsG5+lMRkDojZYSWwolywYx3B9J3WzQHWILOuQyZPfSf9dfHLDypAay8m9DZX3RCIBX1tX7AgMBAAECggEBAIkRYyMGCTYfwGvuagPdYOCH1NxXBjXOjwdL7xUFRenyUDrNxbdq0gcuhbaDzMuq6XFLltwFKecsC4zkqHjqhkZSExLXOMaFLur5+4WErIJzr3OkKC5Wjm9YofDp/XsyldzCq+nomodXXuLGFwi/o8NYNEB5xKSVGNPrIkfqxfNazdR63738zq0ZPQmMjxEb/AK5uc+fdF9qosDrNI0SqQng00mhfpilvwHZbOYPfKNfh26lpqTEAGk0gaFGfr/QnhUDAnxfaoLhr9zELr4utrkwpaCzX958MrRB5naeScocYSl1h4Bi6htjjpdLWDKkk/vQ8Keno6GtF9Iha8MdvnECgYEA9p5UzaP3qYek4pe96milqmPiYkQeqSAUWSp1TpC5ppIoyPGMYl7Ia8SOsIYBw+9WL9iIR6jqZOpd/E68j8YsW5PyJuFYQTVjXZrVD76D435mskl4gsKz1izEWz5jzU/oE4mGfuaobfaOuw5ixun7dd8FrXknIVHbne0zyEZ+FY0CgYEAxw0Jq3aJbrJHX8ahPsZAodbWKYH8Ojkt2GkXKdrB9HJ6EGKockjPj7R/+ForXw2XWoGdoL4QPalhKuJX+3bsSQIgt7mDRiDEPK7XkbKd5mS/HTXWXsTIkGaDhYlq6yOkbmRsR3QgCfnhLYaaYkZ6kIKDsGgUJF8oIqxKrlDWo6cCgYBUyulzbu3nLwklE3Er2GElbYRXrv4vviTg53U/1wjN2bEGLe7Ln7UfQIyi6uBOgsrKVpO8t7onimFYL6YrdMKplfuLHK2gdf+9HlAlQqbMIBilMheqNdFpUSkOCix8Wf38QauplBrS/BPlArQ5mhdoVo74LxCiJyfwa68DLCGLvQKBgEGg4tdNtfJxhWbmrrNr2lOB6gq1eNwZjiwUOjbqkZhvRh+w56kGqKjQ8oCH+lTUvlpw8e/VurUZ65egGTIn+6/2q6Ln34h3tTvsydaX9cfI39pZrdyBNT+nDSYyMLZmggiDw8+rUgT4Bm5kOvK8Gh0bax/2sO1tEmacN+NRc/NxAoGALzEnmKI9B46NVNOWi0VLtTdiloSI6bxgli0Rm8T+6wD6y9JNnWsibYydGx9pDn6w2qihuP1QcKruHUiZ7V8aahhD4o4e/a+IgRzNYcQh4CngUzL+XymlqQVbDSaiEiVi/qSNv+i9mgeF/mSYbYcZjhFPjzdOy3hvtO3GtjDSMQw=";​// 封装发送的消息public static Map<String,String> communicationParams = null;​public static void main(String[] args) {​// A给B发消息ASendMsgToB();​// B接收来自A的消息BReceiveFromA();}​​/*** A给B发消息,首先A-B交换公钥,A拥有 privateKey_A 和 publicKey_B** A使用publicKey_B加密消息,再使用privateKey_A对密文签名,然后将密文和签名发给B*/public static void ASendMsgToB(){​// 消息明文String msg = "你好";​// 加密String encryptMsg = encryptByPublicKey(msg,publicKey_B);​// 签名String sign = signByPrivateKey(encryptMsg,privateKey_A);​// 发送消息communicationParams = new HashMap<String,String>();communicationParams.put("encryptMsg",encryptMsg);communicationParams.put("sign",sign);log.info("A发送给B的消息:{}", JSON.toJSONString(communicationParams));​log.info("-------------------------------------------------");}​/*** B接收A的消息,首先A-B交换公钥,B拥有 privateKey_B 和 publicKey_A** B收到消息后,先使用publicKey_A验签,再使用privateKey_B解密*/public static void BReceiveFromA(){// 接收消息Map<String,String> receiveMsg = communicationParams;log.info("B接收到A的消息:{}", JSON.toJSONString(receiveMsg));String sign = receiveMsg.get("sign");String encryptMsg = receiveMsg.get("encryptMsg");​// 验签Boolean tf = verifySignPublicKey(encryptMsg,publicKey_A,sign);if(tf){log.info("验签通过,说明这个信息是B认可的用户发来的");}​// 解密String msg = decryptByPrivateKey(encryptMsg,privateKey_B);log.info("解密成功,说明这个信息就是发给B的");​​log.info("B收到的消息:{}", msg);}​​/*** RSA签名* @param content 待签名数据* @param privateKey 商户私钥* @return 签名值*/public static String signByPrivateKey(String content, String privateKey){try{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.encode(signed);​}catch (Exception e){log.error(e.getMessage(), e);}​return null;}​/*** RSA验签名检查* @param content 待签名数据* @param sign 签名值* @param publicKey 公钥* @return 布尔值*/public static boolean verifySignPublicKey(String content, String publicKey, String sign){try{KeyFactory keyFactory = KeyFactory.getInstance("RSA");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){log.error(e.getMessage(), e);}​return false;}​/*** RSA公钥加密* @param str 加密字符串* @param publicKey 公钥* @return 密文*/public static String encryptByPublicKey( String str, String publicKey ) {​try{​//base64编码的公钥byte[] decoded = org.apache.commons.codec.binary.Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));​//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = org.apache.commons.codec.binary.Base64.encodeBase64String(cipher.doFinal(str.getBytes(CHATSET)));return outStr;​}catch (Exception e) {log.error(e.getMessage(), e);}​return null;}​/*** RSA私钥解密* @param str 加密字符串* @param privateKey 私钥* @return 明文*/public static String decryptByPrivateKey(String str, String privateKey){​try{​//64位解码加密后的字符串byte[] inputByte = org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes(CHATSET));//base64编码的私钥byte[] decoded = org.apache.commons.codec.binary.Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));​//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;​}catch (Exception e) {log.error(e.getMessage(), e);}​return null;}​}​

运行结果:

 00:09:01.375 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - A发送给B的消息:{"sign":"X13XFI2khSarCOTDjENC/ZTtKfUKAPXuO3b7vossIvC6Aj9WMnKd9w/w64/EqTg+42SGvJXjVpvdglRMmWVrbFSWfmrEfjejaNcq35+aor6j4tMMq0ZVxRO4BxTe+qKDx/e0037dHACvAY2ecojVcbAQaECEc3TrZJguQnte/Nv0DZYPSv/9evPnuKL3DuTl/wy+JaTEhVrvsu/4jXpQ6HRbrhrC4dnzs6AZEqtBXvgfRSkq62jbAvUguDhhZ6yexA2/5S+oOqO8mgRVnooQxkAI5QZd9z0voDIrCDp4emKuznj7vMUjmOXgdD0C3l7LuBqQ469JmAD0U2fRLWMIiQ==","encryptMsg":"lFrlwDA4RjXaxrFPkd8DrbiWQ15o7nNzvLwdWUmTgkDyV5DGMXXsbcEP8aBWqmCje49ymAdzQl3MdO+U2t51QtTvzJOS55EBOZgonN8XJHKNiW7XikWbgf54vUx/mNdHH7fqpBM8AM1qcyH2N3OISFK4NP6eCKgMXRRb3hxw4oko3cGTa98Hnl8jlR9yR2Goy1euT7lpL04VqWcJtP0aEW5gurPkTEDRmOn1UC6x8qZX+K3dxrQfOQhJVRoIOb2hbu/HhzBsknJw1QZTS5IN/n0GlRiJQUwJllQUT4XRF6zmc2y4ewnLwlMY99WqwCaB4XFaBNQO9/5fa7A/XZTr7g=="}00:09:01.378 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - -------------------------------------------------00:09:01.378 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - B接收到A的消息:{"sign":"X13XFI2khSarCOTDjENC/ZTtKfUKAPXuO3b7vossIvC6Aj9WMnKd9w/w64/EqTg+42SGvJXjVpvdglRMmWVrbFSWfmrEfjejaNcq35+aor6j4tMMq0ZVxRO4BxTe+qKDx/e0037dHACvAY2ecojVcbAQaECEc3TrZJguQnte/Nv0DZYPSv/9evPnuKL3DuTl/wy+JaTEhVrvsu/4jXpQ6HRbrhrC4dnzs6AZEqtBXvgfRSkq62jbAvUguDhhZ6yexA2/5S+oOqO8mgRVnooQxkAI5QZd9z0voDIrCDp4emKuznj7vMUjmOXgdD0C3l7LuBqQ469JmAD0U2fRLWMIiQ==","encryptMsg":"lFrlwDA4RjXaxrFPkd8DrbiWQ15o7nNzvLwdWUmTgkDyV5DGMXXsbcEP8aBWqmCje49ymAdzQl3MdO+U2t51QtTvzJOS55EBOZgonN8XJHKNiW7XikWbgf54vUx/mNdHH7fqpBM8AM1qcyH2N3OISFK4NP6eCKgMXRRb3hxw4oko3cGTa98Hnl8jlR9yR2Goy1euT7lpL04VqWcJtP0aEW5gurPkTEDRmOn1UC6x8qZX+K3dxrQfOQhJVRoIOb2hbu/HhzBsknJw1QZTS5IN/n0GlRiJQUwJllQUT4XRF6zmc2y4ewnLwlMY99WqwCaB4XFaBNQO9/5fa7A/XZTr7g=="}00:09:01.379 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - 验签通过,说明这个信息是B认可的用户发来的00:09:01.386 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - 解密成功,说明这个信息就是发给B的00:09:01.386 [main] INFO com.wuxiaolong.EncrypteDecrypt.SignAndEncryptTest - B收到的消息:你好

关注公众号,输入关键字“java-summary”,即可获得源码。

完成,收工!

传播知识,共享价值】,感谢小伙伴们的关注和支持,我是【诸葛小猿】,一个彷徨中奋斗的互联网民工!!!

叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...相关推荐

  1. springboot接口签名统一效验_Python如何接入开放平台?签名验签、加密解密、授权认证测试实战...

    当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...

  2. Python如何接入开放平台?签名验签、加密解密、授权认证测试!

    当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...

  3. 叙述无保密机制的rsa签名过程_电科18年12月考试《信息安全概论》期末大作业【标准答案】...

    17年12月考试<信息安全概论>期末大作业-0001 试卷总分:100    得分:0 一. 单选题 (共 49 道试题,共 98 分) 1.信息具有的重要性质中,不包括() A.普遍性: ...

  4. Java 实现RSA 签名/验签与加密解密

    文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...

  5. java支付宝rsa2签名,使用支付宝SDK进行RSAj加签验签以及加密解密

    /** * 支付宝 sdk 加签验签测试 * * @author 码农猿 */ public class SignDemo { /** * 公钥 */ private static final Str ...

  6. C#实现SM2国密签名签验签和加密解密

    java版本已放出 对应的java版本 话不多说,上码. 依赖,BouncyCastle.Crypto.dll ,经测试,可与java版本的bcprov-jdk15on-1.62.jar互通. 在这里 ...

  7. JMeter BeanShell 实现接口签名验签及加解密

    在利用JMeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,比如对接口请求参数进行签名,加密,响应数据的验签及解密,以及接口公共参数的处理,此时就需要利用BeanShell脚本了,关 ...

  8. iOS小技能:RSA签名、验签、加密、解密的原理

    文章目录 引言 I RSA算法流程 1.1 算法原理 1.2 公钥和私钥的生成 1.3 RSA 加密 1.4 RSA 解密 1.5 RSA加密.签名区别 1.6 RSA签名的过程 II 代码实现 2. ...

  9. 微信小程序-RSA签名、验签、加密、解密

    title: [小程序]RSA签名 type: categories date: 2017-05-27 17:01:15 categories: 小程序 tags: [RSA, 签名] 一个适用于微信 ...

最新文章

  1. 解决读写Excel的第三方类库as3xls无法读取中文和写入中文的问题
  2. java 传 复合类型对象_struts复合类型传值(对象传值)
  3. python都能干什么-python都能做什么
  4. egg.js ajax上传文件,上传图片功能不会使用
  5. 2.3.2 操作系统之实现临界区进程互斥的软件实现方法
  6. python celery异步_python项目_使用异步功能,celery
  7. 【BZOJ2730】【codevs1996】矿场建设,点双联通分量
  8. 4-字符转换及所在位置
  9. exls下载后显示jsp_jsp利用POI直接生成Excel并在页面提示打开下载
  10. 苹果MAC全能多媒体播放器:OmniPlayer Pro
  11. 批量部署windows和linux系统,使用Cobbler批量部署Linux和Windows:Windows系统批量安装(三)...
  12. Excel文件解密软件
  13. 百度移动开放平台认领应用--apk 空包签名
  14. 宫颈癌预测--随机森林
  15. 卓训教育:家长如何管理好孩子的学习?
  16. php实训目的及意义,ps实训目的
  17. Vue2.x动态添加路由实现
  18. unity多人联机插件_别在纠结“后端”开发了,联机小游戏还可以这样做!
  19. douboo php_【H5游戏源码】Long/Hu/Dou/微信游戏源码+全套开源完整源码[整站打包]
  20. 计算机相关分类号,计算机类中图分类号.doc

热门文章

  1. 【AC Saber】二分
  2. 【PAT乙级】1077 互评成绩计算 (20 分)
  3. Spring boot日志框架
  4. Redis的Hash操作
  5. SolrJ添加删除文档
  6. 【JUC并发编程07】Callable接口
  7. 【PAT】A1090 Highest Price in Supply Chain
  8. MySQL的又一神器-锁,MySQL面试必备
  9. springIllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
  10. curl head请求_CURL速查