搜索词>>私服 耗时0.0030
  • nexus3 通过pom.xml配置上传jar包

    一、maven私服上传自建的jar之项目的pom.xml文件配置 <repositories>l;<--私服下载配置-->l; <repository>l; <id>l;repos</id>l; <name>l;Repository</nam一、maven私服上传自建的jar之项目的pom.xml文件配置 <repositories><--私服下载配置--> <repository> <id>repos</id> <name>Repository</name> <url>http://your.ip:port/repository/maven-public/</url> </repository> </repositories> <distributionManagement><!--私有库上传--> <repository> <id>test-my</id><!--仓库ID,必须与maven 的setting.xml配置文件中server配置xml那个ID一致--> <name>my private maven</name><!--仓库描述--> <url>http://your.ip:port/repository/maven-my/</url><!--上传的仓库地址--> </repository> </distributionManagement> 上方配置说明点注意:<id>test-my</id> 这里的ID必须与maven的配置文件setting.xml中的server配置密码节点的ID一致。上传私有库的id必须唯一,后续会用到url地址为nexus私服库的路径,可在nexus管理界面进行复制,很多人默认使用的http://192.168.1.221:8081/repository/maven-releases 或者http://192.168.1.221:8081/repository/maven-snapshots 但是我这里使用的是自己创建的maven-my库。具体情况请跟进你的需求来定。 二、maven私服上传自建的jar之本地maven setting.xml文件配置 用过maven的同学都知道,maven有个重要的配置文件setting.xml。默认情况下,windows操作系统该文件存放路径为C:\Users\用户名\.m2\setting.xml编辑setting.xml添加私有库的认证信息。​配置maven setting.xml 配置点在于: <servers> <server> <id>test-my</id> <username>my</username> <password>lw123456==</password> </server> </servers> 注意:id的值test-my需与项目中的上传私有库配置的id一致,否则会出现权限问题。注意:这里的用户my必须要有相应的仓库操作权限三、通过idea deploy上传jar到私服 idea打开maven项目,选择deploy​上传过程:​好了可以网页登录去nexus3看看上传的结果了​有啥问题评论区留言给我​
  • npm 配置私服库地址

    npm查看当前配置 npm config get registry设置新的配置 npm config set registry https://*.com/path/​​​​​​​代码段 小部件npm查看当前配置 npm config get registry设置新的配置 npm config set registry https://*.com/path/​​​​​​​代码段 小部件
  • linux中samba客服端smbclient整合shell脚本

    linux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件,Linux,samba,smbclientlinux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件<br />   <pre> <code class="language-bash">#!/bin/bash localDir=/smb/media #smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 #其中上面的用户名和密码是guest%1 用户是guest 密码是1,链接操作 smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 <<- EOF #切换本地目录,类似ftp lcd $localDir #切换远程目录 cd 下载 prompt #下载需要下载的文件或匹配文件 mget $1 exit EOF</code></pre> <br /> 执行: <pre> <code class="language-bash">./download-route-samba.sh *速度与激情*.mkv</code></pre> <br /> 执行脚本将会把满足条件的文件全部download到本地。<br /> <br /> 脚本中的很多参数可以根据自身需要进行修改。<br /> <br /> 至次 samba客服端smbclient整合shell脚本实现脚本批处理自动处理等功能。<br /> <br />  
  • Java编程纯jdk java编写webservice服务和客服端

    Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)<br /> <br /> 1.server<br /> <br /> 编写一个简单的server接口 <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface CommService { // 使用@WebMethod注解标注WebServiceI接口中的方法 @WebMethod String sayHello(String name); } </code></pre> <br /> 编写接口实现: <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebService; /** * 使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl * * @author leftso * */ @WebService public class CommServiceImp implements CommService { @Override public String sayHello(String name) { return "Hello ," + name; } } </code></pre> <br /> 将该接口以webservice方式发布出去: <pre> <code class="language-java">package com.leftso.ws; import javax.xml.ws.Endpoint; public class WebServicePublish { public static void main(String[] args) { // 定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx // String address = "http://192.168.1.100:8989/";这个WebService发布地址的写法是合法的 // String address = // "http://192.168.1.100:8989/Webservice";这个WebService发布地址的是合法的 String address = "http://127.0.0.1:9000/WS_Server/Webservice"; // 使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用 Endpoint.publish(address, new CommServiceImp()); System.out.println("发布webservice成功!"); System.out.println("请使用:"+address+"?wsdl 访问"); } } </code></pre> <br /> 运行main方法,访问地址http://127.0.0.1:9000/WS_Server/Webservice?wsdl<br /> 可以看见wsdl文档如下<br /> <img alt="wsdl" class="img-thumbnail" src="/assist/images/blog/f26343d873c54ffd93e74e4b14952f0f.png" /><br /> 2.client<br /> 调用,可以用最简单的jdk自带的工具wsimport生成本地Java代码,以类的方式直接调用方法就行 <pre> <code>wsimport -keep url_wsdl(自己的wsdl地址)</code></pre> <br />  
  • TortoiseGit配置SSH秘钥

    TortoiseGit配置SSH秘钥,TortoiseGitTortoiseGit配置SSH秘钥<br /> <br /> 1.打开秘钥生成器PuTTYgen<br /> <img alt="打开秘钥生成器PuTTYgen" class="img-thumbnail" src="/assist/images/blog/708ca43d12c142109225289e872be93c.png" /><br /> <br /> 2.生成秘钥<br /> <img alt="点击生成见" class="img-thumbnail" src="/assist/images/blog/6d7901b7d54245d5bc033374d2c5e1b8.png" /><br /> <img alt="移动鼠标生成秘钥" class="img-thumbnail" src="/assist/images/blog/68b6505ff0434622a36c5b17fe7fe1d2.png" /><br /> 注意在生成过程中需要鼠标在鼠标移动区域移动。不然进度会停止。<br /> <br /> 3.将生成的公钥复制到git的网站配置中<br /> 生成的秘钥对<br /> <img alt="生成的秘钥对" class="img-thumbnail" src="/assist/images/blog/d7eb6a21b40644ebb489fa22ae27362c.png" /><br /> 复制到git配置中心的秘钥管理<br /> <img alt="复制到git配置中心的秘钥管理" class="img-thumbnail" src="/assist/images/blog/bc603388c6ca4f1aababbace0bfc14f2.png" /><br /> <br /> 4.保存私钥到本地<br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/assist/images/blog/2cadfb56b69d427a8a54ad893304aca7.png" /><br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/assist/images/blog/ce79cc7c7c224a89bd11d70b333973c4.png" /><br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/assist/images/blog/b3d3be4701344e50af9cf9e79f1c5b7f.png" /><br /> <br /> 5.配置TortoiseGit使用的客户端为putty的<br /> <img alt="配置TortoiseGit使用的客户端为putty的" class="img-thumbnail" src="/assist/images/blog/7f91f6f59ac44172b4872f04a972715f.png" /><br /> <img alt="配置TortoiseGit使用的客户端为putty的2" class="img-thumbnail" src="/assist/images/blog/3f671001c8604958985f47978532c141.png" /><br /> <br /> 6.下载通过密钥对加密的git私服项目<br /> <img alt="下载通过密钥对加密的git私服项目" class="img-thumbnail" src="/assist/images/blog/4381cb7255c541e3b6ebeac758211483.png" /><br /> 注意下载的时候加载秘钥位置<br /> <br /> 7.配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key<br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key1" class="img-thumbnail" src="/assist/images/blog/4a927fcbb2ee42cdafebda5004dc48ac.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key2" class="img-thumbnail" src="/assist/images/blog/0a09345bdcc4458ca810fc3f08b79549.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key3" class="img-thumbnail" src="/assist/images/blog/c2c6b88e61894a84810c63a5912a4c4c.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key4" class="img-thumbnail" src="/assist/images/blog/1289a60fc48541eca5733519f0ffe33c.png" /><br /> <br /> 这时候clone的时候就不用再加载私钥了<br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key5" class="img-thumbnail" src="/assist/images/blog/9a270eb6fb3b450ab5061bbb28ae39d6.png" /><br /> <br /> <br />  
  • centos6.8 yum安装和配置ftp server(vsftpd)客服端

    centos6.8 yum安装和配置ftp server(vsftpd)客服端以及ftp常见问题解决,vsftpd################################ FTP Server ##########################<br /> centos6.8 yum安装和配置ftp server(vsftpd)<br /> 安装前提<br /> <strong>1.root用户<br /> 2.主机联网</strong><br /> 安装命令: <pre> <code class="language-bash"> yum install vsftpd</code></pre> <br /> 安装过程:<br /> <br /> <img alt="安装过程" class="img-thumbnail" src="/assist/images/blog/2a19add45c0746c59ced57324b655948.png" /><br /> <br /> 查看是否安装成功<br />   <pre> <code>[root@VM_xx_xx_centos ~]# rpm -qa | grep vsftpd vsftpd-2.2.2-21.el6.x86_64</code></pre> <br /> 如果查询出来有vsftpd-版本号说明已经安装成功。<br /> <br /> 查看yum安装的配置信息: <pre> <code>[root@VM_xx_xx_centos ~]# whereis vsftpd vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz</code></pre> <br /> 安装的配置目录基本这里就三个: <pre> <code>/usr/sbin/vsftpd /etc/vsftpd ​​​​​​​/usr/share/man/man8/vsftpd.8.gz</code></pre> <br /> 很明显,核显配置文件sftpd.conf在/etc/vsftpd中<br /> 切换目录,修改配置.<br /> <span style="color:#e74c3c">注意修改前最好先备份一个原有的,纯属个人习惯</span><br /> sftp.conf常用配置信息说明 <pre> <code> # 允许本地用户登录 local_enable=YES # 本地用户的写权限 write_enable=YES # 使用FTP的本地文件权限,默认为077 # 一般设置为022 local_umask=022 # 切换目录时 # 是否显示目录下.message的内容 dirmessage_enable=YES dirlist_enable = NO #验证方式 #pam_service_name=vsftpd # 启用FTP数据端口的数据连接 connect_from_port_20=YES # 以独立的FTP服务运行 listen=yes # 修改连接端口 #listen_port=2121 ######### 匿名登录设置 ########### # 允许匿名登录 anonymous_enable=NO # 如果允许匿名登录 # 是否开启匿名上传权限 #anon_upload_enable=YES # 如果允许匿名登录 # 是否允许匿名建立文件夹并在文件夹内上传文件 #anon_mkdir_write_enable=YES # 如果允许匿名登录 # 匿名帐号可以有删除的权限 #anon_other_write_enable=yes # 如果允许匿名登录 # 匿名的下载权限 # 匿名为Other,可设置目录/文件属性控制 #anon_world_readable_only=no # 如果允许匿名登录 # 限制匿名用户传输速率,单位bite #anon_max_rate=30000 ######### 用户限制设置 ########### #### 限制登录 # 用userlist来限制用户访问 #userlist_enable=yes # 名单中的人不允许访问 #userlist_deny=no # 限制名单文件放置的路径 #userlist_file=/etc/vsftpd/userlist_deny.chroot #### 限制目录 # 限制所有用户都在家目录 #chroot_local_user=yes # 调用限制在家目录的用户名单 chroot_list_enable=YES # 限制在家目录的用户名单所在路径 chroot_list_file=/etc/vsftpd/chroot_list ######### 日志设置 ########### # 日志文件路径设置 xferlog_file=/var/log/vsftpd.log # 激活上传/下载的日志 xferlog_enable=YES # 使用标准的日志格式 #xferlog_std_format=YES ######### 安全设置 ########### # 用户空闲超时,单位秒 #idle_session_timeout=600 # 数据连接空闲超时,单位秒 #data_connection_timeout=120 # 将客户端空闲1分钟后断开 #accept_timeout=60 # 中断1分钟后重新连接 #connect_timeout=60 # 本地用户传输速率,单位bite #local_max_rate=50000 # FTP的最大连接数 #max_clients=200 # 每IP的最大连接数 #max_per_ip=5 ######### 被动模式设置 ########### # 是否开户被动模式 pasv_enable=yes # 被动模式最小端口 pasv_min_port=5000 # 被动模式最大端口 pasv_max_port=6000 ######### 其他设置 ########### # 欢迎信息 ftpd_banner=Welcome to Ftp Server!</code></pre> <br /> 添加ftp防火墙规则,一般用于安全策略 <pre> <code> /sbin/iptables -I INPUT -p tcp --dport 21 -j ACCEPT /etc/rc.d/init.d/iptables save /etc/init.d/iptables restart</code></pre> <br /> 常用启动重启停止ftp命令: <pre> <code>#启动 service vsftpd start #停止 service vsftpd stop #重启 service vsftpd restart #查看运行状态 service vsftpd status</code></pre> <br /> ftp server 分两种模式<br /> 主动模式配置 <pre> <code>#主动模式 #开启主动模式 port_enable=YES #当主动模式开启的时候 是否启用默认的20端口监听 connect_from_port_20=YES #上一选项使用NO参数是 指定数据传输端口 ftp_date_port=%portnumber%</code></pre> 被动模式配置 <pre> <code>#开启被动模式 pasv_enable=YES #被动模式最低端口 pasv_min_port=5100 #被动模式最高端口 pasv_max_port=5200</code></pre> <br /> 推荐使用被动模式<br /> <br /> <span style="color:#ff0000"><strong>注意:配置文件配置内容后面不允许有空格,所以最好注释写上面配置内容后无任何东西,否则会莫名奇妙报错</strong></span><br /> <br /> ################################ FTP Client ##########################<br /> 安装命令 <pre> <code>yum install ftp</code></pre> <br /> 安装过程<br /> <img alt="client" class="img-thumbnail" src="/assist/images/blog/f54420cbd14f477282a1ecb09260402a.jpg" /><br /> <br /> 安装完成后执行ftp就可以进入ftp客服端<br /> <img alt="client" class="img-thumbnail" src="/assist/images/blog/22b4ae19a1af4f62aec556baa0d514e7.jpg" /><br /> <br /> ################################ 常见问题 QA ################################<br /> 227 Entering Passive Mode<br /> 200 PORT command successful. Consider using PASV.<br /> 解决:<br /> 服务端配置文件中添加或修改以下内容,核心内容是最后一个pasv_address该参数必须绑定<br /> #sv_enable=YES<br /> #被动模式最低端口<br /> pasv_min_port=3100<br /> #被动模式最高端口<br /> pasv_max_port=3200<br /> <strong><span style="color:#cc0000">pasv_address=123.206.71.187(必须项,你自己主机的IP地址)</span></strong><br />   <p>227 Entering Passive Mode<br /> 解决:</p> <pre> <code>ftp> passive Passive mode on.</code></pre> <br /> <p> </p>
  • java处理RSA非对称加解密

    java处理RSA非对称加解密 <pre> <code class="language-java">package org.xqlee.utils.security; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import org.apache.commons.codec.binary.Base64; /** * * * <pre> * _________________________INFO_____________________________ * | Description : [RAS加密/解密工具类|其他说明,非对称加密速度非常慢,内容过大一般使用对称加密,然后对对称加密的密文进行非对称加密] * | Encoding : [UTF-8] * | Package : [org.xqlee.utils.security] * | Project : [utils] * | Author : [LXQ] * | CreateDate : [] * | Updater : [] * | UpdateDate : [] * | UpdateRemark: [] * | Company : [www.zhljc.com] * | Version : [v 1.0] * | Libs : [commons-codec-1.x.jar] * __________________________________________________________ * </pre> */ public class RSAUtil { /** 换行符 **/ private final static String lineSeparator = System.getProperty("line.separator", "\n"); /** 加解密算法键值-这里RSA **/ private final static String KEY_ALGORITHM = "RSA"; /** 获取公钥的KEY **/ public final static String PUBLIC_KEY = "RSAPublicKey"; /** 获取私钥的KEY **/ public final static String PRIVATE_KEY = "RSAPrivateKey"; /** * 生成RSA算法的密钥对 * * @return 密钥对,Map-> key=RSAPublicKey|KEY=RSAPrivateKey * @throws NoSuchAlgorithmException * 获取密钥对可能发生的异常 */ public static Map<String, Object> genKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator kGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); // init the keyPair KeyPair keyPair = kGenerator.generateKeyPair(); // get public key RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // get private key RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keys = new HashMap<String, Object>(); keys.put(PUBLIC_KEY, publicKey); keys.put(PRIVATE_KEY, privateKey); return keys; } /** * 加密 * * @param key * 加密使用的[公钥/私钥] * @param input * 需要加密的明文 * @return 加密后的密文 * @throws Exception * 加密过程中可能发生的异常 */ public static byte[] encrypt(Key key, byte[] input) throws Exception { if (key != null) { // Cipher负责完成加密或解密工作,基于RSA Cipher cipher; try { cipher = Cipher.getInstance(KEY_ALGORITHM); // 根据公钥,对Cipher对象进行初始化 cipher.init(Cipher.ENCRYPT_MODE, key); byte[] resultBytes = cipher.doFinal(input); return resultBytes; } catch (NoSuchAlgorithmException e) { throw new Exception("无此解密算法:" + e.getMessage()); } catch (NoSuchPaddingException e) { throw new Exception("加密过程中发生异常:" + e.getMessage()); } catch (InvalidKeyException e) { throw new Exception("解密私钥非法,请检查:" + e.getMessage()); } catch (IllegalBlockSizeException e) { throw new Exception("密文长度非法:" + e.getMessage()); } catch (BadPaddingException e) { throw new Exception("密文数据已损坏:" + e.getMessage()); } } else { throw new Exception("解密私钥为空, 请设置"); } } /** * 解密 * * @param key * 对应解密的[公钥或私钥] * @param input * 需要解密的加密信息 * @return 解密后的明文信息 * @throws Exception * 解密过程中可能发生的异常 */ public static byte[] decrypt(Key key, byte[] input) throws Exception { if (key == null) { throw new Exception("解密私钥为空, 请设置"); } Cipher cipher = null; try { // Cipher负责完成加密或解密工作,基于RSA cipher = Cipher.getInstance(KEY_ALGORITHM); // 根据私钥,对Cipher对象进行初始化 cipher.init(Cipher.DECRYPT_MODE, key); byte[] output = cipher.doFinal(input); return output; } catch (NoSuchAlgorithmException e) { throw new Exception("无此解密算法:" + e.getMessage()); } catch (NoSuchPaddingException e) { throw new Exception("解密过程中发生异常:" + e.getMessage()); } catch (InvalidKeyException e) { throw new Exception("解密私钥非法,请检查:" + e.getMessage()); } catch (IllegalBlockSizeException e) { throw new Exception("密文长度非法:" + e.getMessage()); } catch (BadPaddingException e) { throw new Exception("密文数据已损坏:" + e.getMessage()); } } /** * 通过文件获取私钥对象 * * @param file * 私钥文件 * @return 私钥对象 * @throws Exception * 从文件私钥获取私钥Java对象过程中可能发生的异常 */ public static PrivateKey getPrivateKey(File file) throws Exception { String strPrivateKey = null; try { BufferedReader br = new BufferedReader(new FileReader(file)); String readLine = null; StringBuilder sb = new StringBuilder(); while ((readLine = br.readLine()) != null) { sb.append(readLine); sb.append(lineSeparator); } br.close(); // 字符 strPrivateKey = sb.toString().substring(0, sb.toString().length() - lineSeparator.length()); } catch (IOException e) { throw new Exception("私钥数据流读取错误:" + e.getMessage()); } try { byte[] buffer = Base64.decodeBase64(strPrivateKey.getBytes()); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) { throw new Exception("=====无此算法====="); } catch (InvalidKeySpecException e) { throw new Exception("=====密钥非法====="); } catch (NullPointerException e) { throw new Exception("=====私钥数据为空====="); } } /** * 通过字符串获取私钥对象 * * @param strPrivateKey * 字符串的私钥 * @return 私钥对象 * @throws Exception * 从字符串私钥获取私钥Java对象过程中可能发生的异常 */ public static PrivateKey getPrivateKey(String strPrivateKey) throws Exception { try { byte[] buffer = Base64.decodeBase64(strPrivateKey.getBytes()); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) { throw new Exception("=====无此算法====="); } catch (InvalidKeySpecException e) { throw new Exception("=====密钥非法====="); } catch (NullPointerException e) { throw new Exception("=====私钥数据为空====="); } } /** * 从公钥文件中加载获取公钥Java对象 * * @param file * 公钥文件 * @return Java公钥对象 * @throws Exception * 获取过程中可能发生的异常 */ public static PublicKey getPublicKey(File file) throws Exception { String strRSAPublicKey = null; try { BufferedReader br = new BufferedReader(new FileReader(file)); String readLine = null; StringBuilder sb = new StringBuilder(); while ((readLine = br.readLine()) != null) { sb.append(readLine); sb.append(lineSeparator); } br.close(); strRSAPublicKey = sb.toString().substring(0, sb.toString().length() - lineSeparator.length()); } catch (IOException e) { throw new Exception("公钥数据流读取错误"); } catch (NullPointerException e) { throw new Exception("公钥输入流为空"); } try { byte[] buffer = Base64.decodeBase64(strRSAPublicKey.getBytes()); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); return keyFactory.generatePublic(keySpec); } catch (NoSuchAlgorithmException e) { throw new Exception("=====无此算法====="); } catch (InvalidKeySpecException e) { throw new Exception("=====公钥非法====="); } catch (NullPointerException e) { throw new Exception("=====公钥数据为空====="); } } /** * 从公钥字符串加载获取公钥Java对象 * * @param strPublicKey * 公钥字符串 * @return Java公钥对象 * @throws Exception * 获取过程中可能发生的异常 */ public static PublicKey getPublicKey(String strPublicKey) throws Exception { try { byte[] buffer = Base64.decodeBase64(strPublicKey.getBytes()); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); return keyFactory.generatePublic(keySpec); } catch (NoSuchAlgorithmException e) { throw new Exception("=====无此算法====="); } catch (InvalidKeySpecException e) { throw new Exception("=====公钥非法====="); } catch (NullPointerException e) { throw new Exception("=====公钥数据为空====="); } } /** * 将Java对象的公钥或者私钥转换为字符串 * * @param key * 公钥/私钥 * @return 秘钥的字符串 */ public static String key2String(Key key) { byte[] keyBytes = key.getEncoded(); String result = new String(Base64.encodeBase64(keyBytes)); return result; } } </code></pre>  
  • 小米蓝牙耳机air2s怎么样

    小米蓝牙耳机air2s怎么样?需要注意防那些坑?​​​​​​​首先来看看长啥样子​小米蓝牙耳机air2s小米蓝牙耳机AIR2S外观篇​耳机取出效果​耳机盒子效果​小米蓝牙耳机总结,从外观来看和上一代小米蓝牙耳机air2 外观区别不大小米蓝牙耳机air2s怎么样?需要注意防那些坑?​​​​​​​首先来看看长啥样子​小米蓝牙耳机air2s小米蓝牙耳机AIR2S外观篇​耳机取出效果​耳机盒子效果​小米蓝牙耳机总结,从外观来看和上一代小米蓝牙耳机air2 外观区别不大。小米蓝牙耳机AIR2S技术参数及防坑篇首先,从官网我们知道,这款耳机支持LHDC蓝牙解码传输格式,如下图:​LHDC蓝牙解码传输支持​LHDC蓝牙解码传输支持特殊说明好了,以上针对小米蓝牙耳机AIR2S坑说明,我的手机目前是小米MIX 2S 我看了手机的MIUI设置,是可以支持LHDC格式的。但是实际使用并没有LHDC支持,于是询问客服。客服说这耳机支持的是LHDC3.0,目前只支持小米10 小米10PRO Redmi K30PRO。作为一个技术公司,我觉得这么重要的信息应该直接在特殊说明里面说明白,而不是打哑谜。导致用户买到后不支持。总结:小米AIR2S目前不支持市面上绝大多数手机!!!如果考虑音质需要LHDC的同学一定要看仔细了!!!!看清楚你的设备是否支持LHDC3.0小米蓝牙耳机AIR2S赞美篇虽然上面一篇给我购物来的极差的体验。但是还是有些好处需要说明的。首先,耳机盒子支持快充,实际体验充电真的非常快;耳机与手机的配对速度也快,基本拿出即可用(可能是MIUI针对优化缘故,其他设备请忽略)。再有就是双芯片也方便,再也不用设置主副耳机了,想用那个取那个。
  • Linux系统SSH命令基础用法

    Linux系统SSH命令基础用法,Linux,Linux系统<h2>SSH远程登录</h2> <h3>口令登录</h3> <p>假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。</p> <pre> <code class="language-bash">$ ssh user@host  如:ssh pika@192.168.0.111</code></pre> <p><br /> 如果本地用户名与远程用户名一致,登录时可以省略用户名。</p> <pre> <code>$ ssh host</code></pre> <p><br /> SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。</p> <pre> <code>$ ssh -p 2222 user@host</code></pre> <p><br /> 上面这条命令表示,ssh直接连接远程主机的2222端口。<br /> 如果你是第一次登录对方主机,系统会出现下面的提示:</p> <pre> <code>$ ssh user@host The authenticity of host 'host (12.18.429.21)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)?</code></pre> <p><br /> 这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?<br /> 所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。<br /> 很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。<br /> 假定经过风险衡量以后,用户决定接受这个远程主机的公钥。</p> <pre> <code>Are you sure you want to continue connecting (yes/no)? yes</code></pre> <p><br /> 系统会出现一句提示,表示host主机已经得到认可。</p> <pre> <code>Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.</code></pre> <p><br /> 然后,会要求输入密码。</p> <pre> <code>Password: (enter password)</code></pre> <p><br /> 如果密码正确,就可以登录了。<br /> 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。<br /> 每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。</p> <h3>公钥登录</h3> <p>使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。<br /> 所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。<br /> 这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:</p> <pre> <code>$ ssh-keygen</code></pre> <p><br /> 运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。<br /> 运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。<br /> 这时再输入下面的命令,将公钥传送到远程主机host上面:</p> <pre> <code>$ ssh-copy-id user@host</code></pre> <p><br /> 好了,从此你再登录,就不需要输入密码了。<br /> 如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。</p> <pre> <code>      RSAAuthentication yes       PubkeyAuthentication yes       AuthorizedKeysFile .ssh/authorized_keys</code></pre> <p><br /> 然后,重启远程主机的ssh服务。</p> <pre> <code>      // ubuntu系统       service ssh restart       // debian系统       /etc/init.d/ssh restart</code></pre> <p><br /> authorized_keys文件<br /> 远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。<br /> 这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:</p> <pre> <code>$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub</code></pre> <p><br /> 这条命令由多个语句组成,依次分解开来看:(1)"$ ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。<br /> 写入authorized_keys文件后,公钥登录的设置就完成了。</p>
  • 多点APP哪些不为人知的套路

    一.多点APP是啥?下图就是多点​用多点官方的陈述就是一家数字零售商解决方案服务商,为大型商超提供“双打”模式的赋能,一方面为超市搭建仓配售一体化的完整电商能力,另一方面为传统零售企业提供深入到零售全链条的数字画改造工作,帮助商超大号监视的一.多点APP是啥?下图就是多点​用多点官方的陈述就是一家数字零售商解决方案服务商,为大型商超提供“双打”模式的赋能,一方面为超市搭建仓配售一体化的完整电商能力,另一方面为传统零售企业提供深入到零售全链条的数字画改造工作,帮助商超大号监视的数字画地基。上面说了一大堆官方的,晦涩难懂,说白点。两个方面:一是给大型超市提供多点自主收银机;二给大型超市提供多点APP网上商城,让用户可以通过多点APP购买超市的东西;二.多点APP套路深从多点APP的官网宣传来说,多点APP的存在确实帮助了企业也方便了用户。用户在家就能逛自己附近的超市,为用户节约了一些时间。​接下来我们来说说多点的套路(也可以说运营质量八吧)事情是这样子滴首先呢,家附近的新世纪做活动啦,多点APP也跟着做活动。并且呢。多点APP还有部分商品的5折卷,本想着真是为用户节约呀​所以立即选购了一些打折商品和一些其他的。下单的时候都是有库存的,不然肯定下不起单的,这个用过淘宝京东的都知道的​单下完了就开开心心的等待实惠的商品送上门了​---------------------------------​华丽的分割线​---------------------------------------电话响了:多点?多点客服:您好您购买的XXX没货了,您看您这边把XXX退货了吧,其他商品马上就可以配送了我:一脸懵逼​,真没货了?没货怎么还能让我们下单?并且下单显示库存大于个位数。​多点客服:不好意思确实没货了。我:....​--------------------------------好吧,没货我也没法了,只能退了​静下心来仔细想了下,这种操作到底谁的锅?​好不容易蹭个活动,蹭你多点推广期间有些优惠卷。买了些优惠的商品,结果单下好了你给我说没货...​你这是要逼着我提个2Xm的刀来超市吓你么​通过活动的方式来刷订单给你的投资商看数据的么?​还是你多点的运营质量体系就这么坑用户呢?​多点啊多点,第一次活动你就坑我,好吧我是农村人,穷怕了。