「java盐值」java加盐什么意思

博主:adminadmin 2022-11-29 21:43:09 54

本篇文章给大家谈谈java盐值,以及java加盐什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

这段JAVA代码什么意思

javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心。

一,与所有的引擎类一样,可以通过调用Cipher类中的getInstance静态工厂方法得到Cipher对象。

public static Cipher getInstance(String transformation);

public static Cipher getInstance(String transformation,String provider);

参数transformation是一个字符串,它描述了由指定输入产生输出所进行的操作或操作集合。

参数transformation总是包含密码学算法名称,比如DES,也可以在后面包含模式和填充方式。

参数transformation可以是下列两种形式之一:

“algorithm/mode/padding”

“algorithm”

例如下面的例子就是有效的transformation形式:

"DES/CBC/PKCS5Padding"

"DES"

如 果没有指定模式或填充方式,就使用特定提供者指定的默认模式或默认填充方式。例如,SunJCE提供者使用ECB作为DES、DES-EDE和 Blowfish等Cipher的默认模式,并使用PKCS5Padding作为它们默认的填充方案。这意味着在SunJCE提供者中,下列形式的声明是 等价的:Cipher c1=Cipher.getInstance("DES/ECB/PKCS5Padding");

Cipher c1=Cipher.getInstance("DES");

当 以流加密方式请求以块划分的cipher时,可以在模式名后面跟上一次运算需要操作的bit数目,例如采用"DES/CFB8/NoPadding"和 "DES/OFB32/PKCS5Padding"形式的transformation参数。如果没有指定数目,则使用提供者指定的默认值(例如 SunJCE提供者使用的默认值是64bit)。

getInstance工厂方法返回的对象没有进行初始化,因此在使用前必须进行初始化。

通过getInstance得到的Cipher对象必须使用下列四个模式之一进行初始化,这四个模式在Cipher类中被定义为final integer常数,我们可以使用符号名来引用这些模式:

ENCRYPT_MODE,加密数据

DECRYPT_MODE,解密数据

WRAP_MODE,将一个Key封装成字节,可以用来进行安全传输

UNWRAP_MODE,将前述已封装的密钥解开成java.security.Key对象

每个Cipher初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。

我们可以调用以下的init方法之一来初始化Cipher对象:

public void init(int opmod,Key key);

public void init(int opmod,Certificate certificate);

public void init(int opmod,Key key,SecureRandom random);

public void init(int opmod,Certificate certificate,SecureRandom random);

public void init(int opmod,Key key,AlgorithmParameterSpec params);

public void init(int opmod,Key key,AlgorithmParameterSpec params,SecureRandom random);

public void init(int opmod,Key key,AlgorithmParameters params);

public void init(int opmod,Key key,AlgorithmParameters params,SecureRandom random);

必须指出的是,加密和解密必须使用相同的参数。当Cipher对象被初始化时,它将失去以前得到的所有状态。即,初始化Cipher对象与新建一个Cipher实例然后将它初始化是等价的。

二,可以调用以下的doFinal()方法之一完成单步的加密或解密数据:

public byte[] doFinal(byte[] input);

public byte[] doFinal(byte[] input,int inputOffset,int inputLen);

public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output);

public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);

在多步加密或解密数据时,首先需要一次或多次调用update方法,用以提供加密或解密的所有数据:

public byte[] update(byte[] input);

public byte[] update(byte[] input,int inputOffset,int inputLen);

public int update(byte[] input,int inputOffset,int inputLen,byte[] output);

public int update(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);

如果还有输入数据,多步操作可以使用前面提到的doFinal方法之一结束。如果没有数据,多步操作可以使用下面的doFinal方法之一结束:

public byte[] doFinal();

public int doFinal(byte[] output,int outputOffset);

如果在transformation参数部分指定了padding或unpadding方式,则所有的doFinal方法都要注意所用的padding或unpadding方式。

调用doFinal方法将会重置Cipher对象到使用init进行初始化时的状态,就是说,Cipher对象被重置,使得可以进行更多数据的加密或解密,至于这两种模式,可以在调用init时进行指定。

三,包裹wrap密钥必须先使用WRAP_MODE初始化Cipher对象,然后调用以下方法:

public final byte[] wrap(Key key);

如果将调用wrap方法的结果(wrap后的密钥字节)提供给解包裹unwrap的人使用,必须给接收者发送以下额外信息:

(1)密钥算法名称:

密钥算法名称可以调用Key接口提供的getAlgorithm方法得到:

public String getAlgorithm();

(2)被包裹密钥的类型(Cipher.SECRET_KEY,Cipher.PRIVATE_KEY,Cipher.PUBLIC_KEY)

sourcelink: ;nid=41716order=tid=

为了对调用wrap方法返回的字节进行解包,必须先使用UNWRAP_MODE模式初始化Cipher对象,然后调用以下方法 :

public final Key unwrap(byte[] wrappedKey,String wrappedKeyAlgorithm,int wrappedKeyType));

其 中,参数wrappedKey是调用wrap方法返回的字节,参数wrappedKeyAlgorithm是用来包裹密钥的算法,参数 wrappedKeyType是被包裹密钥的类型,该类型必须是Cipher.SECRET_KEY,Cipher.PRIVATE_KEY, Cipher.PUBLIC_KEY三者之一。

四,SunJCE提供者实现的cipher算法使用如下参数:

(1)采用CBC、CFB、OFB、PCBC模式的DES、DES-EDE和Blowfish算法。,它们使用初始化向量IV作为参数。可以使用javax.crypto.spec.IvParameterSpec类并使用给定的IV参数来初始化Cipher对象。

(2)PBEWithMD5AndDES使用的参数是一个由盐值和迭代次数组成的参数集合。可以使用javax.crypto.spec.PBEParameterSpec类并利用给定盐值和迭代次数来初始化Cipher对象。

注意:如果使用SealedObject类,就不必为解密运算参数的传递和保存担心。这个类在加密对象内容中附带了密封和加密的参数,可以使用相同的参数对其进行解封和解密。

Cipher 中的某些update和doFinal方法允许调用者指定加密或解密数据的输出缓存。此时,保证指定的缓存足够大以容纳加密或解密运算的结果是非常重要 的

spring Boot必用依赖框架

使用Lombok框架

在编写POJO类型(包括实体类、VO、DTO等)时,都有统一的编码规范 ,例如:

由于以上操作方式非常固定,且涉及的代码量虽然不难,但是篇幅较长,并且,当类中的属性需要修改时(包括修改原有属性、或增加新属性、删除原有属性),对应的其它方法都需要修改(或重新生成),管理起来比较麻烦。

在Spring Boot中, 添加Lombok依赖 ,可以在创建项目时勾选,也可以后期自行添加,依赖项的代码为:

完成后,在各POJO类型中,将不再需要在源代码添加Setters Getters、`equals()`、`hashCode()`、`toString()`这些方法, 只需要在POJO类上添加 `@Data` 注解即可 !

当添加`@Data`注解,且删除相关方法后,由于源代码中没有相关方法,则调用了相关代码的方法可能会报错,但是,并不影响程序运行!

为了避免IntelliJ IDEA判断失误而提示了警告和错误, 推荐安装Lombok插件 ,可参考:

【注】: 无论是否安装插件,都不影响代码的编写和运行!

Slf4j日志框架

在开发实践中, 不允许 使用` System.out.println() `或类似的输出语句来输出显示关键数据( 核心数据、敏感数据等 ),因为,如果是这样使用,无论是在开发环境,还是测试环境,还是生产环境中,这些输出语句都将输出相关信息,而删除或添加这些输出语句的操作成本比较高,操作可行性低。

推荐 的做法是使用日志框架来输出相关信息!

在Slf4j日志框架中,将日志的可显示级别根据其重要程度( 严重程度 )由低到高分为:

在配置文件中,可以通过`logging.level.包名.类名`来设置当前类的日志显示级别,例如:

当设置了显示的日志级别后,仅显示设置级别和更重要的级别的日志,例如,设置为`info`时,只显示`info`、`warn`、`error`,不会显示`debug`、`trace`级别的日志!

当输出日志时,通过`log`变量调用`trace()`方法输出的日志就是`trace`级别的,调用`debug()`方法输出的日志就是`debug()`级别的,以此类推,可调用的方法还有`info()`、`warn()`、`error()`。

在开发实践中, 关键数据和敏感数据都应该通过`trace()`或`debug()`进行输出 ,在开发环境中,可以将日志的显示级别设置为`trace`,则会显示所有日志,当需要交付到生产环境中时,只需要将日志的显示级别调整为`info`即可!

默认情况下,日志的显示级别是`info`,所以,即使没有在配置文件中进行正确的配置,所有info、warn、error级别的日志都会输出显示。

在使用Slf4j时,通过`log`调用的每种级别的方法都被重载了多次(各级别对应除了方法名称不同,重载的次数和参数列表均相同),推荐使用的方法是参数列表为`(String format, Object... arguments)`的,例如:

以上方法中, 第1个参数是将要输出的字符串的模式(模版) ,在此字符串中,如果需要包含某个变量值,则 使用`{}`表示 ,如果有多个变量值,均是如此,然后,再通过第2个参数(是可变参数)依次表示各`{}`对应的值,例如:

使用这种做法,可以避免多变量时频繁的拼接字符串,另外,日志框架会将第1个参数进行缓存,以此提高后续每一次的执行效率。

在开发实践中,应该对程序执行 关键位置添加日志 的输出,通常包括:

其实, Slf4j日志框架只是 日志 的一种 标准 ,并不是具体的实现(感觉上与Java中的接口有点相似),常见有具体实现了日志功能的框架有log4j、logback等,为了统一标准,所以才出现了Slf4j,同时,由于log4j、logback等框架实现功能并不统一,所以,Slf4j提供了对主流日志框架的兼容,在Spring Boot工程中,`spring-boot-starter`就已经依赖了`spring-boot-starter-logging`,而在此依赖下,通常包括Slf4j、具体的日志框架、Slf4j对具体日志框架的兼容。

密码加密( 额外知识点 )

【这并不是Spring Boot框架的知识点】

对密码进行加密,可以有效的保障密码安全,即使出现数据库泄密,密码安全也不会受到影响! 为了实现此目标,需要在对密码进行加密时, 使用不可逆的算法进行处理!

通常,不可以使用加密算法对密码进行加密码处理,从严格定义上来看,所有的加密算法都是可以逆向运算的,即同时存在加密和解密这2种操作,加密算法只能用于保证传输过程的安全,并不应该用于保证需要存储下来的密码的安全!

哈希算法都是不可逆的,通常,用于处理密码加密的算法中,典型的是一些 消息摘要算法 ,例如 MD5、SHA256 或以上位数的算法。

消息摘要算法的主要特征有 :

在消息摘要算法中,以MD5为例,其运算结果是一个128位长度的二进制数,通常会转换成十六进制数显示,所以是32位长度的十六进制数,MD5也被称之为128位算法。理论上,会存在2的128次方种类的摘要结果,且对应2的128次方种不同的消息,如果在未超过2的128次方种消息中,存在2个或多个不同的消息对应了相同的摘要,则称之为:发生了碰撞。一个消息摘要算法是否安全,取决其实际的碰撞概率,关于消息摘要算法的破解,也是研究其碰撞概率。

存在穷举消息和摘要的对应关系 ,并利用摘要在此对应关系进行查询,从而得知消息的做法,但是,由于MD5是128位算法,全部穷举是不可能实现的,所以,只要原始密码(消息)足够复杂,就不会被收录到所记录的对应关系中去!

为了进一步提高密码的安全性,在使用 消息摘要算法 进行处理时, 通常还会加盐! 盐值可以是任意的字符串,用于与密码一起作为被消息摘要算法运算的数据即可,例如:

加盐的目的 是使得被运算数据变得更加复杂,盐值本身和用法并没有明确要求!

甚至,在某些用法或算法中,还会使用随机的盐值,则可以使用完全相同的原消息对应的摘要却不同!

推荐了解:预计算的 哈希链 、 彩虹表 、 雪花算法 。

为了进一步保证密码安全,还可以使用多重加密,即反复调用消息摘要算法。

除此以外,还可以使用安全系数更高的算法,例如SHA-256是256位算法,SHA-384是384位算法,SHA-512是512位算法。

Validation框架

当客户端向服务器提交请求时,如果 请求数据出现 明显的问题(例如关键数据为`null`、字符串的长度不在可接受范围内、其它 格式错误 ),应该直接响应错误,而不是将明显错误的请求参数传递到Service!

关于判断错误,只有涉及数据库中的数据才能判断出结果的,都由Service进行判断,而基本的格式判断,都由Controller进行判断 。

Validation框架是专门用于解决 检查数据基本格式有效性 的,最早并不是Spring系列的框架,目前,Spring Boot提供了更好的支持,所以,通常结合在一起使用。

在Spring Boot项目中,需要添加`spring-boot-starter-validation` 依赖项 ,例如:

在控制器中,首先,对需要检查数据格式的请求参数添加 `@Valid` 或 `@Validated` 注解(这2个注解没有区别),例如:

真正需要检查的是 `AdminAddNewDTO`中各属性的值 ,所以,接下来需要在此类的各属性上通过注解来配置检查的规则,例如:

重启项目,通过不提交用户名的URL(例如:)进行访问,在浏览器上会出现400错误页面,并且,在IntelliJ IDEA的控制台会出现以下警告:

从警告信息中可以看到,当验证失败时(不符合所使用的注解对应的规则时),会出现`org. springframework.validation.BindException `异常,则自行处理此异常即可!

首先,在`State`中添加新的枚举:

然后,在`GlobalExceptionHandler`中添加新的处理异常的方法:

关于错误提示信息,以上内容中出现了`不能为null`的字样,是默认的提示文本,可以通过` @NotNull`注解的 `message` 属性进行配置 ,例如:

然后,在处理异常时,通过异常信息获取自定义的提示文本:

再次运行,在不提交用户名和密码的情况下,会随机的提示用户名或密码验证失败的提示文本中的某1条。

在Validation框架中 ,还有其它许多注解,用于进行不同格式的验证,例如:

以上注解,包括`@NotNull`是 允许叠加使用 的,即允许在同一个参数属性上添加多个注解!

以上注解均可以配置 `message` 属性,用于指定验证失败的提示文本。

通常:(开发中)

Java开发实战经典的作品目录

第1部分 Java基础程序设计

第1章 Java概述及开发环境搭建

视频讲解:35分钟

1.1 认识Java

1.2 Java开发环境搭建

1.3 本章要点

1.4 习题

第2章 简单的Java程序

视频讲解:20分钟

2.1 一个简单的Java范例

2.2 Java程序的注释

2.3 Java中的标识符

2.4 Java中的关键字

2.5 变量和常量

2.6 本章要点

2.7 习题

第3章 Java基础程序设计

视频讲解:2小时09分钟

3.1 数据类型划分

3.2 基本数据类型

3.3 数据类型的转换

3.4 运算符、表达式与语句

3.5 选择与循环语句

3.6 本章要点

3.7 习题

第4章 数组与方法

视频讲解:1小时48分钟

4.1 数组的定义及使用

4.2 方法的声明及使用

4.3 数组的引用传递

4.4 Java新特性对数组的支持

4.5 本章要点

4.6 习题

第2部分 Java面向对象程序设计

第5章 面向对象(基础篇)

视频讲解:6小时34分钟

5.1 面向对象的基本概念

5.2 类与对象

5.3 封装性

5.4 构造方法

5.5 匿名对象

5.6 实例讲解——类设计分析

5.7 String

5.8 引用传递及基本应用

5.9 this关键字

5.10 static关键字

5.11 代码块

5.12 构造方法私有化

5.13 对象数组

5.14 内部类

5.15 实例讲解

5.16 本章要点

5.17 习题

第6章 面向对象(高级篇)

视频讲解:4小时20分钟

6.1 继承的基本概念

6.2 继承的进一步研究

6.3 范例——继承的应用

6.4 final关键字

6.5 抽象类的基本概念

6.6 接口的基本概念

6.7 对象的多态性

6.8 instanceof关键字

6.9 抽象类与接口的应用

6.10 实例分析:宠物商店

6.11 Object类

6.12 包装类

6.13 匿名内部类

6.14 本章要点

6.15 习题

第7章 异常的捕获及处理

视频讲解:1小时18分钟

7.1 异常的基本概念

7.2 throws与throw关键字

7.3 Exception类与Runtime Exception类

7.4 自定义异常类

7.5 断言

7.6 本章要点

7.7 习题

第8章 包及访问控制权限

视频讲解:55分钟

8.1 包的概念及使用

8.2 jar命令的使用

8.3 访问控制权限

8.4 Java命名规范

8.5 本章要点

8.6 习题

第3部分 Java应用程序设计

第9章 多线程

视频讲解:2小时36分钟

9.1 进程与线程

9.2 Java中线程的实现

9.3 线程的状态

9.4 线程操作的相关方法

9.5 线程操作范例

9.6 同步与死锁

9.7 线程操作案例——生产者及消费者

9.8 线程的生命周期

9.9 本章要点

9.10 习题

第10章 泛型

视频讲解:1小时52分钟

第11章 Java常用类库

视频讲解:5小时38分钟

第12章 Java IO

视频讲解:7小时52分钟

第13章 Java类集

视频讲解:3小时50分钟

第14章 枚举

视频讲解:55分钟

第15章 Java反射机制

视频讲解:2小时24分钟

第16章 Annotation

视频讲解:1小时19分钟

第17章 Java数据库编程

视频讲解:4小时15分钟

第18章 图形界面

视频讲解:6小时15分钟

第19章 Java网络编程

视频讲解:1小时8分钟

第20章 Java新IO

视频讲解:1小时33分钟

第21章 Eclipse开发工具

视频讲解:1小时35分钟

参考文献

JAVA中绑定变量的测试代码

一段在JAVA中绑定变量的测试代码,大家可以将代码测试一下,理解其实现原理,对大家学习肯定能有所帮助,中国自学编程网为大家整理。

import java.sql.*;

import oracle.jdbc.driver.*;

class ConOra {

public static void main(String args[] ) throws SQLException{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

Connection conn = DriverManager.getConnection(jdbc:oracle:thin:@192.168.1.152:1521:whx,system,lukewhx);

PreparedStatement stmt ;

ResultSet rset ;

String v_sql;

/*

for (int i =1;i=1000;i++){

v_sql=select object_name from objects where object_id=+i;

stmt =conn.prepareStatement(v_sql);

rset=stmt.executeQuery();

stmt.close();

}

*/

for (int i =1 ;i=1000;i++ ) {

v_sql = select object_name from objects where object_id= :x ;

stmt=conn.prepareStatement(v_sql);

stmt.setString(1,Integer.toString(i));

rset = stmt.executeQuery();

stmt.close();

}

System.out.println(Execute OK);

}

}

java shiro加盐之后怎么反解密

hash函数是一种单向散列算法,这意味着从明文可以得到散列值,而散列值不可以还原为明文。

验证密码的方法是将用户输入的密码与盐值按照加密时使用的hash算法再hash一次,并与数据库中存储的hash值作比较,若两者一致则认为密码正确。

java怎样存储密码字段?

一般来说登录时候的密码是加密之后存入数据库的。都是密文的。这里加密可以用MD5,也可以用其他的盐值加密

关于java盐值和java加盐什么意思的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-29,除非注明,否则均为首码项目网原创文章,转载请注明出处。