范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何设计一个安全对外的接口?加签验签了解一下

  推荐阅读:太强了吧,架构师联手总结17w字的计算机基础知识与操作系统PDF 每天2小时,奋战31天,我凭这份PDF拿下腾讯、阿里、京东等offer SpringMVC+Spring+MyBatis框架搭建校园兼职平台项目免费分享 前言
  我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全。接下来,本文将和大家一起来学习加签和验签。从理论到实战,加油哦~密码学相关概念加签验签概念为什么需要加签、验签加密算法简介加签验签相关API加签验签代码实现
  明文、密文、密钥、加密、解密明文:指没有经过加密的信息/数据。密文:明文被加密算法加密之后,会变成密文,以确保数据安全。密钥:是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。加密:将明文变成密文的过程。解密:将密文还原为明文的过程。对称加密、非对称加密对称加密:加密和解密使用相同密钥的加密算法。非对称加密:非对称加密算法需要两个密钥(公开密钥和私有密钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。
  什么是公钥私钥?公钥与私钥是成对存在的密钥,如果用公钥对数据进行加密,只有用对应的私钥才能解密。其实,公钥就是公开的秘钥,私钥就是要你私自保存好的秘钥。非对称加密算法需要有一对公私钥~
  假设你有一个文件,你用字母a加密,只有字母b才能解密;或者你用b加密,只有a才能解密,那么a和b就是一对公私钥。如果密钥a公开,密钥b你就要私自保存好啦,这时候密钥a就是公钥,密钥b就是私钥。相反,如果b公开,a就要保存好,这时候呢,秘钥b就是公钥,秘钥a就是私钥。加签验签概念「加签」:用Hash函数把原始报文生成报文摘要,然后用私钥对这个摘要进行加密,就得到这个报文对应的数字签名。通常来说呢,请求方会把「数字签名和报文原文」一并发送给接收方。「验签」:接收方拿到原始报文和数字签名后,用「同一个Hash函数」从报文中生成摘要A。另外,用对方提供的公钥对数字签名进行解密,得到摘要B,对比A和B是否相同,就可以得知报文有没有被篡改过。
  为什么需要加签验签
  上小节中,加签和验签我们已经知道概念啦,那么,为什么需要加签和验签呢?有些朋友可能觉得,我们不是用「公钥加密,私钥解密」就好了嘛?
  接下来呢,举个demo吧。
  假设现在有A公司,要接入C公司的转账系统。在一开始呢,C公司把自己的公钥寄给A公司,自己收藏好私钥。A公司这边的商户,发起转账时,A公司先用C公司的公钥,对请求报文加密,加密报文到达C公司的转账系统时,C公司就用自己的私钥把报文揭开。假设在加密的报文在传输过程中,被中间人Actor获取了,他也郁闷,因为他没有私钥,看着天鹅肉,又吃不了。本来想修改报文,给自己账号转一个亿的,哈哈。这个实现方式看起来是天衣无缝,稳得一匹的。
  但是呢,如果一开始,C公司把公钥发给公司A的时候,就被中间人Actor获取到呢,酱紫就出问题了。
  中间人Actor截取了C的公钥,他把自己的公钥发给了A公司,A误以为这就是C公司的公钥。A在发起转账时,用Actor的公钥,对请求报文加密,加密报文到在传输过程,Actor又截取了,这时候,他用自己的私钥解密,然后修改了报文(给自己转一个亿),再用C的公钥加密,发给C公司,C公司收到报文后,继续用自己的私钥解密。最后是不是A公司的转账账户损失了一个亿呢~
  C公司是怎么区分报文是不是来自A呢,还是被中间人修改过呢?为了表明身份和报文真实性,这就需要「加签验签」啦!
  A公司把自己的公钥也发送给C公司,私钥自己保留着。在发起转账时,先用自己的私钥对请求报文加签,于是得到自己的数字签名。再把数字签名和请求报文一起发送给C公司。C公司收到报文后,拿A的公钥进行验签,如果原始报文和数字签名的摘要内容不一致,那就是报文被篡改啦~
  有些朋友可能有疑问,假设A在发自己的公钥给C公司的时候,也被中间人Actor截取了呢。嗯嗯,我们来模拟一波Actor又截取了公钥,看看Actor能干出什么事情来~哈哈
  假设Actor截取到A的公钥后,随后也截取了到A发往C的报文。他截取到报文后,第一件想做的事肯定是修改报文内容。但是如果单单修改原始报文是不可以的,因为发过去C公司肯定验签不过啦。但是呢,数字签名似乎解不开,因为消息摘要算法(hash算法)无法逆向解开的,只起验证的作用呢....
  所以呢,公钥与私钥是用来加密与加密的,「加签与验签是用来证明身份」,以免被篡改的。常见加密相关算法简介消息摘要算法对称加密算法非对称加密算法国密算法消息摘要算法:相同的明文数据经过相同的消息摘要算法会得到相同的密文结果值。数据经过消息摘要算法处理,得到的摘要结果值,是无法还原为处理前的数据的。数据摘要算法也被称为哈希(Hash)算法或散列算法。消息摘要算法一般用于签名验签。
  消息摘要算法主要分三类:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息认证码算法)。
  MD家族算法
  MD(Message Digest,消息摘要算法)家族,包括MD2,MD4,MD5。MD2,MD4,MD5 计算的结果都是是一个128位(即16字节)的散列值,用于确保信息传输完整一致。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5则比MD4更安全、速度更快。MD5被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD5,可以被攻破,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
  举个例子,看看如何获取字符串的MD5值吧:public class MD5Test {      public static void main(String[] args) throws UnsupportedEncodingException {         String s = "123";         byte[] result = getMD5Bytes(s.getBytes());         StringBuilder stringBuilder = new StringBuilder();         for (byte temp : result) {             if (temp >= 0 && temp < 16) {                 stringBuilder.append("0");             }             stringBuilder.append(Integer.toHexString(temp & 0xff));         }         System.out.println(s + ",MD5加密后:" + stringBuilder.toString());     }      private static byte[] getMD5Bytes(byte[] content) {         try {             MessageDigest md5 = MessageDigest.getInstance("MD5");             return md5.digest(content);         } catch (NoSuchAlgorithmException e) {             throw new RuntimeException(e);         }     } }
  运行结果:123,MD5加密后:202cb962ac59075b964b07152d234b70ShA家族算法
  SHA(Secure Hash Algorithm,安全散列算法),包括SHA-0、SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384等)、SHA-3。它是在MD算法基础上实现的,与MD算法区别在于「摘要长度」,SHA 算法的摘要「长度更长,安全性更高」。
  ❝ SHA-0发布之后很快就被NSA撤回,因为含有会降低密码安全性的错误,它是SHA-1的前身。SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。SHA-2包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。它的算法跟SHA-1基本上相似,目前还没有出现明显弱点。SHA-3是2015年正式发布,由于对「MD5出现成功的攻破」,以及对SHA-0和SHA-1出现理论上攻破的方法,SHA-3应运而生。它与之前算法不同的是,它是可替换的加密散列算法。 ❞
  SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384)等算法是比较常用的,我们来看看跟MD5的对比吧
  MAC算法家族
  MAC算法 MAC(Message Authentication Code,消息认证码算法),是带密钥的Hash函数。输入密钥和消息,输出一个消息摘要。 它集合了MD和SHA两大系列消息摘要算法。MD 系列算法: HmacMD2、HmacMD4 和 HmacMD5 ;SHA 系列算法:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384 和 HmacSHA512 。对称加密算法
  加密和解密使用「相同密钥」的加密算法就是对称加密算法。常见的对称加密算法有AES、3DES、DES、RC5、RC6等。
  DES
  数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法。 DES算法的入口参数有三个:Key、Data、Mode。Key: 7个字节共56位,是DES算法的工作密钥;Data: 8个字节64位,是要被加密或被解密的数据;Mode: 加密或解密。3DES
  三重数据加密算法(英语:Triple Data Encryption Algorithm,又称3DES(Triple DES),是一种对称密钥加密块密码,相当于是对每个数据块应用三次数据加密标准(DES)算法。AES
  AES,高级加密标准(英语:Advanced Encryption Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。采用对称分组密码体制,密钥长度为 128 位、 192 位、256 位,分组长度128位相对于DES ,AES具有更好的 安全性、效率 和 灵活性。非对称加密算法
  非对称加密算法需要两个密钥:公钥和私钥。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有用对应的私钥才能解密。主要的非对称加密算法有:RSA、Elgamal、DSA、D-H、ECC。
  RSA算法RSA加密算法是一种非对称加密算法,广泛应用于加密和数字签名RSA算法原理:两个大素数的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA是被研究得最广泛的公钥算法,从提出到现在,经历了各种攻击的考验,普遍认为是目前最优秀的公钥方案之一。DSADSA(Digital Signature Algorithm,数字签名算法),也是一种非对称加密算法。DSA和RSA区别在,DSA仅用于数字签名,不能用于数据加密解密。其安全性和RSA相当,但其性能要比RSA好。ECC 算法ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学),基于椭圆曲线加密。Ecc主要优势是,在某些情况下,它比其他的方法使用更小的密钥,比如RSA加密算法,提供相当的或更高等级的安全级别。它的一个缺点是,加密和解密操作的实现比其他机制时间长 (相比RSA算法,该算法对CPU 消耗严重)。国密算法
  国密即国家密码局认定的国产密码算法。为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,即SM1,SM2,SM3,SM4等国密算法。
  SM1SM1,为对称加密算法,加密强度为128位,基于硬件实现。SM1的加密强度和性能,与AES相当。SM2SM2主要包括三部分:签名算法、密钥交换算法、加密算法SM2用于替换RSA加密算法,基于ECC,效率较低。SM3SM3,即国产消息摘要算法。适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成。SM4SM4是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。它的功能类似国际算法的DES。加签验签相关Java的API
  这个小节先介绍一下加签验签需要用到的API吧~
  加签相关API- java.security.Signature.getInstance(String algorithm); //根据对应算法,初始化签名对象 - KeyFactory.getInstance(String algorithm);// 根据对应算法,生成KeyFactory对象 - KeyFactory.generatePrivate(KeySpec keySpec); //生成私钥 - java.security.Signature.initSign(PrivateKey privateKey) //由私钥,初始化加签对象 - java.security.Signature.update(byte[] data)  //把原始报文更新到加签对象 - java.security.Signature.sign();//加签
  「Signature.getInstance(String algorithm);」根据对应算法,初始化签名对象algorithm参数可以取SHA256WithRSA或者MD5WithRSA等参数,SHA256WithRSA表示生成摘要用的是SHA256算法,签名加签用的是RSA算法
  「KeyFactory.getInstance(String algorithm);」根据对应算法,生成KeyFactory对象,比如你的公私钥用的是RSA算法,那么就传入RSA
  「KeyFactory.generatePrivate(KeySpec keySpec)」生成私钥,加签用的是私钥哈,所以需要通过KeyFactory先构造一个私钥对象。
  「Signature.initSign(PrivateKey privateKey)」加签用的是私钥,所以传入私钥,初始化加签对象
  「Signature.update(byte[] data)」把原始报文更新到加签对象
  「java.security.Signature.sign();」进行加签操作验签相关API- java.security.Signature.getInstance(String algorithm); //根据对应算法,初始化签名对象 - KeyFactory.getInstance(String algorithm);// 根据对应算法,生成KeyFactory对象 - KeyFactory.generatePublic(KeySpec keySpec); //生成公钥 - java.security.Signature.initVerify(publicKey); //由公钥,初始化验签对象 - java.security.Signature.update(byte[] data)  //把原始报文更新到验签对象 - java.security.Signature.verify(byte[] signature);//验签
  「Signature.getInstance(String algorithm)」根据对应算法,初始化签名对象,注意验签和加签是需要用相同的algorithm算法参数哦~
  「KeyFactory.getInstance(String algorithm);」根据对应算法,生成KeyFactory对象
  「KeyFactory.generatePublic(KeySpec keySpec);」生成公钥,验签用的是公钥,通过KeyFactory先构造一个公钥对象
  **Signature.initVerify(publicKey); **公钥验签,所以传入公钥对象参数,初始化验签对象
  「Signature.update(byte[] data)」把原始报文更新到加签对象
  「Signature.verify(byte[] signature);」进行验签操作加签验签代码实现
  前几个小节讨论完概念,是时候上代码实战了,我这边用的是SHA-256作为摘要算法,RSA作为签名验签算法,如下:package pattern;  import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;  import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec;  /**  * 加签验签demo  *  @Author 捡田螺的小男孩  */ public class SignatureTest {     //公钥字符串     private static final String PUBLIC_KEY_STR = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaJzVjC5K6kbS2YE2fiDs6H8pB " +             "JFDGEYqqJJC9I3E0Ebr5FsofdImV5eWdBSeADwcR9ppNbpORdZmcX6SipogKx9PX " +             "5aAO4GPesroVeOs91xrLEGt/arteW8iSD+ZaGDUVV3+wcEdci/eCvFlc5PUuZJou " +             "M2XZaDK4Fg2IRTfDXQIDAQAB";     //私钥字符串     private static final String PRIVATE_KEY_STR = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANonNWMLkrqRtLZg " +             "TZ+IOzofykEkUMYRiqokkL0jcTQRuvkWyh90iZXl5Z0FJ4APBxH2mk1uk5F1mZxf " +             "pKKmiArH09floA7gY96yuhV46z3XGssQa39qu15byJIP5loYNRVXf7BwR1yL94K8 " +             "WVzk9S5kmi4zZdloMrgWDYhFN8NdAgMBAAECgYA9bz1Bn0i68b2KfqRdgOfs/nbe " +             "0XNN1DLQp2t7WDfRCg01iI1zPkZgyFVZWtI85f5/uIrLs5ArLosL1oNuqqc0nNne " +             "CvJK+ZxvA98Hx3ZqYTzDnleR054YhofL5awbhSciYVic204DOG1rhSsYWMqtX7J7 " +             "3geoWL7TYdMfYXcCAQJBAPMMKsz6ZJh98EeQ1tDG5gpAGWFQkYNrxZDelP/LjeO0 " +             "TP3XkQnIpcaZoCs7V/rRGRGMWwQ2BUdc/01in89ZZ5ECQQDlx2oBc1CtOAm2UAhN " +             "1xWrPkZWENQ53wTrwXO4qbTGDfBKon0AehLlGCSqxQ71aufLkNO7ZlX0IHTAlnk1 " +             "TvENAkAGSEQ69CXxgx/Y2beTwfBkR2/gghKg0QJUUkyLqBlMz3ZGAXJwTE1sqr/n " +             "HiuSAiGhwH0ByNuuEotO1sPGukrhAkAMK26a2w+nzPL+u+hkrwKPykGRZ1zGH+Cz " +             "19AYNKzFXJGgclCqiMydY5T1knBDYUEbj/UW1Mmyn1FvrciHoUG1AkAEMEIuDauz " +             "JabEAU08YmZw6OoDGsukRWaPfjOEiVhH88p00veM1R37nwhoDMGyEGXVeVzNPvk7 " +             "cELg28MSRzCK";       public static void main(String[] args) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException, InvalidKeySpecException {         //原始报文         String plain = "欢迎大家关注我的公众号,捡田螺的小男孩";         //加签         byte[] signatureByte = sign(plain);         System.out.println("原始报文是:" + plain);         System.out.println("加签结果:");         System.out.println(new BASE64Encoder().encode(signatureByte));         //验签         boolean verifyResult = verify(plain, signatureByte);         System.out.println("验签结果:" + verifyResult);     }      /**      * 加签方法      * @param plain      * @return      * @throws NoSuchAlgorithmException      * @throws InvalidKeyException      * @throws UnsupportedEncodingException      * @throws SignatureException      */     private static byte[] sign(String plain) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, SignatureException {         //根据对应算法,获取签名对象实例         Signature signature = Signature.getInstance("SHA256WithRSA");         //获取私钥,加签用的是私钥,私钥一般是在配置文件里面读的,这里为了演示方便,根据私钥字符串生成私钥对象         PrivateKey privateKey = getPriveteKey(PRIVATE_KEY_STR);         //初始化签名对象         signature.initSign(privateKey);         //把原始报文更新到对象         signature.update(plain.getBytes("UTF-8"));         //加签         return signature.sign();     }      /**      * 验签方法      * @param plain      * @param signatureByte      * @return      * @throws NoSuchAlgorithmException      * @throws InvalidKeyException      * @throws IOException      * @throws SignatureException      * @throws InvalidKeySpecException      */     private static boolean verify(String plain, byte[] signatureByte) throws NoSuchAlgorithmException, InvalidKeyException, IOException, SignatureException, InvalidKeySpecException {         //获取公钥         PublicKey publicKey = getPublicKey(PUBLIC_KEY_STR);         //根据对应算法,获取签名对象实例         Signature signature = Signature.getInstance("SHA256WithRSA");         //初始化签名对象         signature.initVerify(publicKey);         //把原始报文更新到签名对象         signature.update(plain.getBytes("UTF-8"));         //进行验签         return signature.verify(signatureByte);     }      private static PublicKey getPublicKey(String publicKeyStr) throws InvalidKeySpecException, IOException {         PublicKey publicKey = null;         try {             java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(                     new BASE64Decoder().decodeBuffer(publicKeyStr));             // RSA对称加密算法             java.security.KeyFactory keyFactory;             keyFactory = java.security.KeyFactory.getInstance("RSA");             // 生成公钥对象             publicKey = keyFactory.generatePublic(bobPubKeySpec);            } catch (NoSuchAlgorithmException e) {              e.printStackTrace();             }         return publicKey;       }      private static PrivateKey getPriveteKey(String privateKeyStr) {         PrivateKey privateKey = null;         PKCS8EncodedKeySpec priPKCS8;         try {             priPKCS8 = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(privateKeyStr));             KeyFactory keyf = KeyFactory.getInstance("RSA");             privateKey = keyf.generatePrivate(priPKCS8);         } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {             e.printStackTrace();         }         return privateKey;     } }
  「运行结果:」加签结果: Oz15/aybGe42eGHbc+iMoSYHSCc8tfRskTVjjGSTPD4HjadL0CC5JUWNUW0WxHjUb4MvxWo2oeWE Qw0+m61d+JgBMto/TWcVDcgwL/AbObsbWdQ6E/fVRqG13clkE8MyKsjt9Z7tcbwpycYTv0rUR4co rndAVfBdtv5KeV+OXqM= 验签结果:true
  作者:Jay_huaxiao
  链接:https://juejin.im/post/5f13474c5188252e677bcbbf

2599元,坚果P3S便携投影仪开启预售90度转动镜头IT之家8月9日消息坚果P3S便携投影仪于近日发布,采用可旋转机身镜头,预售价2599元。坚果P3S采用便携设计,为水杯大小,配备90度转动镜头,并自带56160mWh电池,续航时阿里巴巴女员工被侵害事件的多重警示近日,阿里巴巴一名女员工在网络上发文称其在济南出差期间,被领导要求陪济南华联商家喝酒,遭到商家和领导猥亵,引发热议。8月9日凌晨,阿里巴巴董事会主席兼首席执行官(CEO)张勇在阿里阿里巴巴女员工被侵害!高管部门表示多一事不如少一事8月7日阿里巴巴员工匿名发布文章称,自己在7月27日晚上被客户和领导强奸,之后并没有选择忍气吞声,自己多次向公司寻求解决的办法,公司像踢皮球一样推三阻四,到现在都没有一个合理的解决大学生一定要买苹果手机吗?手机在我看来它就是一个工具,是现阶段科技的产物,目的是让我们生活更丰富,简洁,方便,他并不是固定的某一个牌子或者某一款。尤其是年轻人,手机一般用来干啥,刷刷短视频,打打游戏,现在的把自然风搬进家!这5款无叶风扇安全又舒适虽说夏天的命是空调给的,但不少病也是空调给的,头痛关节痛过凉感冒不是很热的情况下,还是建议大家多使用风扇。传统风扇吹不远,而且吹久会头疼,想要舒适降温,不妨试试无叶风扇,送风柔和自阿里女员工被侵害事件低俗酒文化,我们都是凶手这是25万阿里人的耻辱一夜,连阿里CEO张勇用震惊气愤羞愧,表达对阿里一员工涉嫌侵犯女同事事件的感受。我们来一起还原下事情的经过阿里妹子跟着领导去出差,在酒席上灌醉妹子,然后客户趁阿里猥亵案溯源之企业文化和价值观阿里案溯源之企业文化价值观作者,老兵涛哥一个互联网企业的巨头,怎么也没有想到,会被一个弱者通过互联网用毁灭自己的方式捍卫自己并使该企业陷入了万众声讨的尴尬处境。一个底层的员工,要向特斯拉电动皮卡又要爽约了,但比亚迪海豚来了特斯拉Cybertruck电动皮卡的首批交付预计需要到明年才能完成。特斯拉更新了官网主页的订单脚注,显示Cybertruck电动皮卡的提车时间为2022年。原定是2021年底交付首民生银行这个小倒霉蛋儿!被二次暴击民生银行在发行新的联名卡时候,放佛有了魔咒,很容易刚发行不久,联名方就出负面了。这不民生又一次被暴击了。民生银行刚刚将阿里88vip进行更定换代,此前卡面为升级后卡面数量减少,只有Veritas顾海巍数据将成未来企业重要资产赛迪网讯随着大数据人工智能物联网的快速发展,近几年数据的安全尤为被业界关注,尤其是大数据AI等技术的蓬勃发展,推动了企业的数字化进程。根据Veritas观察,所有企业在数字化转型中手机电池续航方法,更耐用,又学到一招相信很多人都有遇到过这种问题,就是使用路由器看电视或者玩游戏的时候,经常出现卡顿缓冲,WiFi信号老是中断,今天就分享给大家一个巧用一张纸提升WiFi信号的小技巧,快来看看吧首先,
不要忘记9月18日!今天南京试防空警报1931年9月18日从沉阳北郊六跳湖附近一声巨响揭露屈辱的历史未来14年超过3500万兄弟姐妹伤亡曾经美丽的土地被疯狂践踏89年过去了但是所有这些屈辱我们永远不会忘记敢忘今天上午1在工作运行中的液晶拼接屏拥有哪些特点优势作为当前国内应用非常火热的大屏幕多媒体显示设备,液晶拼接屏的应用领域越来广阔,如企事业单位交通指挥安全监控航空航天军事能源等,且得到了广大用户的众多好评。在使用的过程中,用户可以自论灰尘会对液晶拼接屏造成哪些伤害如今,液晶拼接屏的应用日益广泛,应用领域不断扩展,我们经常都可以看到它的身影,已经逐渐融入我们生活的方方面面。作为一款电子产品,液晶拼接屏拥有一定的使用寿命的,所以我们就要对它进行要做型号核准SRRC认证的有哪些设备必须?中国型号核准简称SRRC认证,是国家强制性认证,旨在将无线波段中的民用波段与军用波段区分开。是在无线电发射设备投入使用前的研制生产进口购置等环节,对其频谱参数技术指标依法进行技术管当下小程序运营难点有哪些?商家应该如何解决?现如今,越来越多的商家开始将线上线下结合经营,但是在经营中运营是很大的难点,让众商家苦不堪言,那么当下,小程序运营难点有哪些,商家应该如何解决呢?一小程序运营难点有哪些?1没有品牌餐饮店留存难?怎么锁定新老客户?这份私域引流实战送给你对于餐饮行业,其实有很多店客流是不错的,但是有很多店主不懂得把这些流量留下来,白白浪费了更大的流量价值。有店主说,现在让消费者办理会员卡关注公众号太难了。其实这些动作没有那么难,需中秋佳节来袭,商家如何巧用小程序营销提升店铺销量?中秋节作为国家传统节日,任何行业都在做节日营销,小程序也不例外。现在距离中秋节还有一个月的时间,对于已经利用得有店搭建了小程序的商家已经可以着手准备了。对于还没有搭建小程序的商家,传统实体店流量被瓜分,商家如何利用小程序突出重围?无论是线上还是线下,都在拼命抢夺流量,连锁店因为其品牌影响力,迅速吸引大批客户,传统实体店因为无法有效推广宣传,因此遭受重创,那么传统实体店应该如何与连锁企业做竞争呢?其实实体店想电动打蛋器怎么办理CE认证?电动打蛋器又分为手提电动打蛋器和座式带桶电动打蛋器,是用来将鸡蛋的蛋清和蛋黄打散充分融合成蛋液单独将蛋清和蛋黄打到起泡的工具。电动打蛋器出口欧盟需要办理CE认证,办理CE认证做电磁IPX3防水测试办理IPX3防水测试办理!IPX3的检测是喷溅水由垂直方向向任何一侧倾斜直到60度,没有产生有害影响,测试方法是摆管从垂直方向到60度方向,最大距离200毫米处喷溅。IPX3防水测试办嵌入式灯具CE认证怎么办理?嵌入式灯具CE认证怎么办理?灯具安装使用后,灯具本体结构是不外漏的,灯体其他部分是嵌入到建筑物或其他物体内而看不见的。嵌入式灯具及类似产品欧盟CE认证LVD低电压安全标准。CE认证