包含标签 java 的文章

OTP动态口令:原理与java实现

前言

对外网开放的后台管理系统,只用静态口令认证有几个先天问题:用户为了好记会选有特征的密码、明文传输时可被截获、内部人员能拿到密码冒用。OTP(One-Time Password,一次性密码/动态口令)是最容易落地的双因素认证增强手段,这篇整理它的原理和一套 java 实现方案。

一、静态口令的风险

  1. 便于记忆的密码往往有特征,容易被猜测和爆破
  2. 非加密传输时认证信息可被直接截获
  3. 合法授权者(包括内部人员)可以复制密码冒用,事后无法追责

静态口令从根本上无法确定「现在操作的人就是账户本人」。

……

阅读全文

一些正则小细节-不定期补充

前言

记录日常工作碰到的一些正则小细节

1、group分组

需要通过()把提取的参数圈起来,这样才会产生分组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
private static String collectMapperId(String value) {
        String result = "";
        String regId = "id=\"(.*?)\"";
        Pattern pattern = Pattern.compile(regId);
        Matcher matcher = pattern.matcher(value);
        if (matcher.find()) {
            result = matcher.group(1);
        }
        return result;
    }

对比如果没有(),是没有分组效果的

……

阅读全文

sdkman的使用

前言

多sdk版本管理工具

1、安装java jdk

1
sdk install java

2、安装指定版本的 java jdk

1
sdk install java 8u131

3、安装本地包

1
sdk install groovy 3.0.0-SNAPSHOT /path/to/groovy-3.0.0-SNAPSHOT

4、移除 java jdk

1
sdk uninstall java 21-graalvm

5、查看当前生效的 java jdk

1
2
3
sdk current java
# 查看所有本地包的当前版本
sdk current

6、查看支持的清单

1
sdk list

7、查看软件的版本

1
sdk list java

8、临时切换版本

1
sdk use java 8.0.232.hs-adpt

9、切换默认版本

1
sdk default java 11.0.5.hs-adpt

10、sdk 版本升级

1
2
3
sdk upgrade springboot
# 本地所有sdk全部升级
sdk upgrade 

11、sdkman 版本升级

1
2
3
sdk selfupdate
# 强制重新安装
sdk selfupdate force

12、查看 sdkman 的版本

1
sdk version

13、离线模式

1
2
3
4
5
sdk offline enable
  Forced offline mode enabled.

sdk offline disable
  Online mode re-enabled!

当电脑没有网的时候,离线模式会进行自动切换.

……

阅读全文

@FeignClient属性详解与bean重名冲突处理

前言

微服务项目里 OpenFeign 是最常用的声明式 HTTP 客户端,但 @FeignClient 的属性含义很多人只停留在 value 上。这篇整理注解的全属性解读,以及一个常见的坑:多个 FeignClient 指向同一个服务时的 bean 重名冲突。

一、@FeignClient 全属性解读

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {

    /**
     * 1、value 与 name 互为别名,两者二选一即可
     * 2、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 3、当未指定 url 请求地址的时候,最终会通过 ribbon-loadbalancer 工具,
     *    从注册中心选取 service-id 等于 value 的服务作为请求地址
     */
    @AliasFor("name")
    String value() default "";

    /**
     * serviceId 已作废,其目的与 value 一致。如果设置了 serviceId,
     * 则 value/name 皆以 serviceId 为准
     */
    @Deprecated
    String serviceId() default "";

    /**
     * 1、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 2、当 qualifier 没有值的时候,会将 '${contextId}FeignClient' 作为
     *    feign 的 bean 组件别名
     */
    String contextId() default "";

    /** 同 value,二选一 */
    @AliasFor("value")
    String name() default "";

    /**
     * feign 的 bean 组件别名,拥有最高优先级;
     * 当 qualifier 为空时,取 '${contextId}FeignClient' 作为 bean 的名称
     */
    String qualifier() default "";

    /**
     * 1、设置 url 以后,后续发起 http 调用时,直接读取该地址作为请求目标;
     * 2、未设置 url 时,借助 ribbon-loadbalancer 组件,根据 (value/name)
     *    从注册中心的服务列表中选中 service-id 匹配的目标服务
     */
    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?>[] fallback() default void.class;

    Class<?>[] fallbackFactory() default void.class;

    /**
     * 目标服务器对应的资源 uri(FeignClient 下所有方法相同的 path 前缀)
     */
    String path() default "";

    boolean primary() default true;
}

属性速查:

……

阅读全文

log4j2远程执行漏洞

前言

12月9日爆出来的log4j2远程执行漏洞,因为影响巨大,网上新闻和介绍特别多,这里不多说,间接使用log4j2的第三方也不少,等官网修复不知道是否赶得上,直接采用暴力删除jndilook.class最简单

1、直接删除漏洞class

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
set -eu
for JAR_PATH in "$@"; do
	if [[ $JAR_PATH != *log4j-core*.jar ]] || [ -e "$JAR_PATH.bak" ] || ! [ -f "$JAR_PATH" ]; then
		echo "Skipped $JAR_PATH"
		continue
	fi
	echo "Processing $JAR_PATH"
	cp -p "$JAR_PATH" "$JAR_PATH.bak"
	zip -q -d "$JAR_PATH" org/apache/logging/log4j/core/lookup/JndiLookup.class
done

2、Apache log4j2漏洞官方说明

官方漏洞说明: https://logging.apache.org/log4j/2.x/security.html

……

阅读全文

lombok一些注解的含义

前言

lombok一些注解的含义整理

1、@Accessors(chain = true)

链式风格,在调用set方法时,返回这个类的实例对象,比如:a.b.c

2、@Data

在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString 注解,即当使用当前注解时,会自动生成包含的所有方法;

……

阅读全文

caffeine和springcache

前言

说到caffeine,一般会对比 google 家的 guava,这里只做浅析。

缓存

缓存分为本地缓存和远端缓存。
常见的远端缓存有Redis,MongoDB;
本地缓存一般使用map的方式保存在本地内存中。

一般我们在业务中操作缓存,都会操作缓存和数据源两部分。
如:put数据时,先插入DB,再删除原来的缓存;get数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中。
如果访问量大,我们还得兼顾本地缓存的线程安全问题。
必要的时候也要考虑缓存的回收策略。

……

阅读全文

java编码安全

后端java开发 – 转自腾讯github

1.1 数据持久化

1.1.1【必须】SQL语句默认使用预编译并绑定变量

Web后台系统应默认使用预编译绑定变量的形式创建sql语句,保持查询语句和数据相分离。以从本质上避免SQL注入风险。

如使用Mybatis作为持久层框架,应通过#{}语法进行参数绑定,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数。

示例:JDBC

……

阅读全文

maven校验依赖包CVE漏洞

前言

maven也可以校验依赖包是有有CVE漏洞

1、maven检测依赖包CVE漏洞

1
mvn verify -DskipTests=true
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<build>
    <plugins>
        <!-- owasp check CVE 检查依赖包是否有漏洞  command: mvn verify -->
        <plugin>
            <groupId>org.owasp</groupId>
            <artifactId>dependency-check-maven</artifactId>
            <version>6.5.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2、检测结果demo

第一次执行因下载CVE数据有些慢

……

阅读全文

jvm的大dump文件分析

前言

参考dump文件的大小,如果超过6G、8G 一般我们本地电脑无法打开,可以找大容量的linux服务器,配置对应启动的jvm 内存后可以参考下面的步骤

1、下载linux版本的mat

1
wget http://eclipse.stu.edu.tw/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip

2、解压zip包

unzip MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip

3、修改linux mat的堆内存大小(看自己下载的堆的大小,默认mat的堆支持1g)

1
vi MemoryAnalyzer.ini
1
2
3
4
5
6
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx10240m

4、执行分析脚本

1
./ParseHeapDump.sh [hprof文件] org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

可能因为 jdk 版本不一致导致启动失败,可以调整 jdk 为1.8.*

1
2
3
export JAVA_HOME=/opt/soft/jdk/jdk1.8.0_66/
export PATH=$JAVA_HOME/bin:$PATH
"$(dirname -- "$0")"/MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@"

5、等待分析结果

……

阅读全文

最近文章

分类

标签

其它