2月8
  /*验证IP是否属于某个IP段
   *
   * ipSection    IP段(以'-'分隔)
   * ip           所验证的IP号码
   *
   */
  public static boolean ipExistsInRange(String ip, String ipSection) {
    ipSection = ipSection.trim();
    ip = ip.trim();
    int idx = ipSection.indexOf('-');
    String beginIP = ipSection.substring(0, idx);
    String endIP = ipSection.substring(idx + 1);
    return getIp2long(beginIP) <= getIp2long(ip) && getIp2long(ip) <= getIp2long(endIP);
  }

  public static long getIp2long(String ip) {
    ip = ip.trim();
    String[] ips = ip.split("\\.");
    long ip2long = 0L;
    for (int i = 0; i < 4; ++i) {
      ip2long = ip2long << 8 | Integer.parseInt(ips[i]);
    }

    return ip2long;
  }

  public static long getIp2long2(String ip) {
    ip = ip.trim();
    String[] ips = ip.split("\\.");
    long ip1 = Integer.parseInt(ips[0]);
    long ip2 = Integer.parseInt(ips[1]);
    long ip3 = Integer.parseInt(ips[2]);
    long ip4 = Integer.parseInt(ips[3]);
    long ip2long = 1L * ip1 * 256 * 256 * 256 + ip2 * 256 * 256 + ip3 * 256 + ip4;

    return ip2long;
  }

  public static boolean isIntranetIP(String ip) {
  ipExistsInRange(ip, "172.16.0.0-172.31.255.255") || ip.startsWith("10.");
        //10.10.10.116 是否属于固定格式的IP段10.10.1.00-10.10.255.255

        String ip="10.10.10.116";

        String ipSection="10.10.1.00-10.10.255.255";

        boolean exists=ipExistsInRange(ip,ipSection);

        System.out.println(exists);

        System.out.println(getIp2long(ip));

        System.out.println(getIp2long2(ip));
  }
1月25

mongodb 设置用户密码权限

09:03数据库  From: 本站原创
1、设置管理员账户

use admin
db.createUser({ user: "useradmin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
mongodb中的用户是基于身份role的,该管理员账户的 role是 userAdminAnyDatabase。 ‘userAdmin’代表用户管理身份,’AnyDatabase’ 代表可以管理任何数据库。

2、验证

db.auth("useradmin", "adminpassword")
如果返回1,则表示成功。

3、修改配置文件(注意缩进)

sudo vi /etc/mongod.conf
#security:
security:
  authorization: enabled

4、重启mongodb

sudo service mongod restart
5、创建普通用户

进入mongodb,用第3步的 管理员账户登录,用该账户创建其他数据库管理员账号

  +先进行管理员认证

use admin
db.auth("useradmin", "adminpassword")
  +设置其他库的账号密码及权限

use yourdatabase
db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "yourdatabase" }] })
  rote:dbOwner 代表数据库所有者角色,拥有最高该数据库最高权限。比如新建索引等
12月25
1:echo $JAVA_HOME

使用$JAVA_HOME的话能定位JDK的安装路径的前提是配置了环境变量$JAVA_HOME,否则如下所示,根本定位不到JDK的安装路径

[root@localhost ~]# java -version

java version "1.7.0_65"

OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)

OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

[root@localhost ~]# echo $JAVA_HOME

点击在新窗口中浏览此图片

2:which java

首先要申明一下which java是定位不到安装路径的。which java定位到的是java程序的执行路径。那么怎么定位到java的安装路径呢?下面我们来看看例子吧,如下所示:
[root@localhost ~]# java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.5.5.el7-x86_64 u51-b31)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
[root@localhost ~]# which java
/usr/bin/java
[root@localhost ~]# ls -lrt /usr/bin/java
lrwxrwxrwx. 1 root root 22 9月   6 22:51 /usr/bin/java -> /etc/alternatives/java
[root@localhost ~]# ls -lrt /etc/alternatives/java
lrwxrwxrwx. 1 root root 72 9月   6 22:51 /etc/alternatives/java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java

点击在新窗口中浏览此图片
Tags:
12月23

MySQL的replace方法

09:20数据库  From: 本站原创
mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()
Update `table_name` SET `field_name` = replace (`field_name`,’from_str’,'to_str’) Where `field_name` LIKE ‘%from_str%’

实例:把'病假' 替换为 '--':UPDATE users SET username=REPLACE(username,'病假','--')  WHERE username LIKE '%病假%';
说明:
table_name —— 表的名字
field_name —— 字段名
from_str —— 需要替换的字符串
to_str —— 替换成的字符串

---------------------------------

mysql 里面可以用uuid()语句来生成一个UUID:

select uuid();
或 select replace(uuid(), '-', '');

直接在insert语句中插入UUID作主键的用法(简便):

insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);

------------------------------
在mysql中,可以使用uuid 来生成主键,但是用mysql的uuid()函数 ,生成的uuid是36位的,其中包含32个字符以及4个分隔符(-),往往这个分隔符对我们来说是没有用的,可以使用mysql自带的replace函数去掉分隔符

replace(uuid(),'-','')   ---->将uuid()中的‘-’,去掉,即替换成空串;

此外

upper(replace(uuid(),'-',''))用于将字符转换为大写
--------------------------------

一、replace函数
语法:replace(object,search,replace)
语义:把object对象中出现的的search全部替换成replace。
实例:

update hellotable set 'helloCol' = replace('col','heck','heckjj.com')

二、replace into函数
为什么会接触到replace into函数,是因为业务需要向数据库中插入数据,前提是重复的不能再次插入。以前用where解决的,今天才知道还有一个更简洁的方法replace。
replace具备替换拥有唯一索引或者主键索引重复数据的能力,也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况,将会删除原先的数据,然后再进行添加。
语法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
语义:向table表中col1, col2, col3列replace数据val1,val2,val3

实例:
REPLACE INTO users (id,name,age) VALUES(123, ‘chao’, 50);
12月3
最近在做一个微信公众号项目,用微信开发工具调试本地项目,需要做一下内网穿透,代理都配置好了,页面出现这个Invalid Host header错误,内网穿透工具我是用的frps做的,最后通过google找到方法,在vue-cli版本为2.x的情况下修改webpack.dev.conf.js中的devServer对象加入disableHostCheck: true即可转发成功

devServer: {
  disableHostCheck: true,
}

vue-cli版本3.0的情况下修改vue.config.js的配置

module.exports = {
  devServer: {
    disableHostCheck: true
  }
}
11月27
   linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心。

线上查询及帮助命令(2个)

man:查看命令帮助,命令的词典,更复杂的还有info,但不常用。
help:查看Linux内置命令的帮助,比如cd命令。

文件和目录操作命令(18个)

ls:全拼list,功能是列出目录的内容及其内容属性信息。
cd:全拼change directory,功能是从当前工作目录切换到指定的工作目录。
cp:全拼copy,其功能为复制文件或目录。
find:查找的意思,用于查找目录及目录下的文件。
mkdir:全拼make directories,其功能是创建目录。
mv:全拼move,其功能是移动或重命名文件。
pwd:全拼print working directory,其功能是显示当前工作目录的绝对路径。
rename:用于重命名文件。
rm:全拼remove,其功能是删除一个或多个文件或目录。
rmdir:全拼remove empty directories,功能是删除空目录。
touch:创建新的空文件,改变已有文件的时间戳属性。
tree:功能是以树形结构显示目录下的内容。
basename:显示文件名或目录名。
dirname:显示文件或目录路径。
chattr:改变文件的扩展属性。
lsattr:查看文件扩展属性。
file:显示文件的类型。
md5sum:计算和校验文件的MD5值。

查看文件及内容处理命令(21个)

cat:全拼concatenate,功能是用于连接多个文件并且打印到屏幕输出或重定向到指定文件中。
tactac:是cat的反向拼写,因此命令的功能为反向显示文件内容。
more:分页显示文件内容。
less:分页显示文件内容,more命令的相反用法。
head:显示文件内容的头部。
tail:显示文件内容的尾部。
cut:将文件的每一行按指定分隔符分割并输出。
split:分割文件为不同的小片段。
paste:按行合并文件内容。
sort:对文件的文本内容排序。
uniq:去除重复行。
wc:统计文件的行数、单词数或字节数。
iconv:转换文件的编码格式。
dos2unix:将DOS格式文件转换成UNIX格式。
diff:全拼difference,比较文件的差异,常用于文本文件。
vimdiff:命令行可视化文件比较工具,常用于文本文件。
rev:反向输出文件内容。
grep/egrep:过滤字符串,三剑客老三。
join:按两个文件的相同字段合并。
tr:替换或删除字符。
vi/vim:命令行文本编辑器。

Tags:
11月23
对称加密:
DES,AES,加密解密都用一个秘钥,速度快

非对称机密
RSA,可以私钥加密公钥解密,也可以公钥机密私钥解密,速度慢

注意:
RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。
RSA加密对明文的长度是有限制的,如果加密数据过大会抛出异常:

常见加密算法

DES
    DES是Data Encryption Standard(数据加密标准)的缩写,DES算法为密码体制中的对称密码体制。它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,二十年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
    DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。
    特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
  DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间。

    DES现在已经不视为一种安全的加密算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解。也有一些分析报告提出了该算法的理论上的弱点,虽然实际情况未必出现。该标准在最近已经被高级加密标准(AES)所取代。

AES
    高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元。

RSA
    RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

    RSA算法的可靠性基于分解极大的整数是很困难的。假如有人找到一种很快的分解因子的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

    RSA算法利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信息的保密和安全。

关于RSA公钥/私钥/签名RSAUtils工具包类,提供生成密钥对(公钥和私钥)-genKeyPair、用私钥对信息生成数字签名(sign)、校验数字签名(verify)、私钥解密(decryptByPrivateKey)、公钥解密(decryptByPublicKey)、公钥加密(encryptByPublicKey)、私钥加密(encryptByPrivateKey)、获取私钥(getPrivateKey)、获取公钥(getPublicKey)、获取校验码(getVerifyCode)等方法,详情参见代码示例部分。
Tags: , ,
11月18
1.我为什么会出现这个问题?

意思是无法在根节点  Software\JavaSoft\Prefs 创建命令,实际上就是当前不是管理员权限在运行,需要管理员权限运行。

2.这个错大概的意思就是

警告:无法打开/创建prefs根节点软件\\javasoft \\prefs根节点0x800000002 (这里是百度翻译),但是里面的关键字就是说无法打开,那就代表着权限不够。

3.解决方案

Step1:搜索并运行regedit.exe

Step2: 进入HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft,右击JavaSoft目录,选择新建->项(key),命名为Prefs

Step3: 重新编译即可。
11月18
原因:
1. SecureRandom 类中 setSeed()底层调用的是 native 方法.所以造成了不同环境之间随机数出现了差别。导致解密不一致问题。
2. 由于linux和window的内核不同造成的!

解决:对加密程序 添加如下两行 代码控制 随机数即可解决问题。然后初始化,就能解决这个问题!
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(PASSWORD.getBytes());

示例如下:
package com.heckjj.utils;


import java.security.SecureRandom;


import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


import org.apache.axis.encoding.Base64;
import org.apache.commons.lang.StringUtils;


import lombok.extern.slf4j.Slf4j;


@Slf4j
public class AESUtils {


    /**
     * 加密
     *
     * @param content 需要加密的内容
     * @param secureKey 加密秘钥
     * @return
     */
    public static String encrypt(String content, String secureKey) {
        try {
            if (StringUtils.isEmpty(content)
                        || StringUtils.isEmpty(secureKey)) {
                return null;
            }


            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            /*
             * 问题我已自己解决,这个是由于linux和window的内核不同造成的!
             * SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
             * secureRandom.setSeed(PASSWORD.getBytes());
             * 然后初始化,就能解决这个问题!
             */
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(secureKey.getBytes());
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return encodeBASE64(result); // 加密
        } catch (Exception e) {
            log.error("加密错误.", e);
        }
        return null;
    }


    /**
     * 解密
     *
     * @param content 待解密内容
     * @param password secureKey
     * @return
     */
    public static String decrypt(String content, String secureKey) {
        try {
            if (StringUtils.isEmpty(content) || StringUtils.isEmpty(secureKey)) {
                return null;
            }

            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(secureKey.getBytes());
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            byte[] base64Dec = Base64.decode(content);
            byte[] result = cipher.doFinal(base64Dec);
            return new String(result);
        } catch (Exception e) {
            log.warn("解密错误,错误信息是:{}", e);
        }
        return null;
    }

    public static String encodeBASE64(byte[] content) throws Exception {
        if (content == null || content.length == 0)
            return null;
        try {
            return Base64.encode(content);
        } catch (Exception e) {
            log.error("Base64 encode error.", e);
            return null;
        }
    }

}
11月11

Windows安装nginx服务

11:23Web开发  From: 本站原创
1、测试版本

  nginx版本:nginx-1.18.0;windows版本:win server 2008 r2

2、下载winsw。

  当前最新版本为:winsw-2.1.2。下载地址:https://github.com/kohsuke/winsw/releases。

3、将WinSW.NET4.exe复制到nginx目录下(保证nginx的目录不含空格),并重命名为nginx-svr.exe。

4、在nginx目录下新增文件nginx-svr.xml。

<service>

     <id>nginx</id>

     <name>Nginx Service</name>

     <description>High Performance Nginx Service.</description>

   <logpath>E:\nginx-1.18.0\logs</logpath>  
  
   <log mode="roll-by-size">  
  
     <sizeThreshold>10240</sizeThreshold>
    
     <keepFiles>8</keepFiles>  
    
   </log>
  
   <executable>E:\nginx-1.18.0\nginx.exe</executable>  
  
   <startarguments>-pE:\nginx-1.18.0</startarguments>
  
   <stopexecutable>E:\nginx-1.18.0\nginx.exe</stopexecutable>
  
   <stoparguments>-pE:\nginx-1.18.0 -s stop</stoparguments>
  
</service>

5、在nginx目录下新增文件nginx-svr.exe.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727" />
        <supportedRuntime version="v4.0" />
    </startup>
    <runtime>
        <generatePublisherEvidence enabled="false" />
    </runtime>
</configuration>

6、使用管理员身份运行cmd。

  右键“C:\Windows\System32\cmd.exe”,选择“已管理员身份运行”。

7、运行命令:nginx-svr.exe install。


8、卸载nginx服务,在cmd命令窗口下执行:nginx-svr.exe uninstall。

提示:1、若出现“WMI.WmiException: AccessDenied”错误,请检测cmd命令是否以管理员身份打开的。
分页: 14/66 第一页 上页 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]