`

java中的SecureRandom在linux中的实现和windows不同坑很深

 
阅读更多

      自身有一套OA源码,在windows开发和部署都没有问题,在linux和os里面就无法部署一致爆无法解密,找了很多方法,因为本身项目中用的rcs的方式以为是加密java的jdk版本换了跟windows一样还是不可以。

      在Linux操作系统中,有一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。

/dev/random

在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到从别的设备中收集到了足够的环境噪声为止。

当然你也可以设置成不堵塞,当你在open 的时候设置参数O_NONBLOCK, 但是当你read的时候,如果熵池空了,会返回-1

/dev/urandom

/dev/random的一个副本是/dev/urandom ("unlocked",非阻塞的随机数发生器[4]),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

 

 

Linux下设置随机数

/proc/sys/kernel/random

在此目录下,可以配置/dev/random的参数

Poolsize

The file poolsize gives the size of the entropy pool

Read-wakeup_threadhold

The file read_wakeup_threshold contains the number of bits ofentropy required for waking up processes that sleep waiting for entropy from /dev/random.  The default is 64. 

write_wakeup_threshold

The filewrite_wakeup_threshold contains the number of bits of entropy below which wewake up processes that do a select(2) or poll(2) for write access to /dev/random.

 

在JAVA中的配置发生器

Java中可以通过两种方式去设置指定的随机数发生器

1.      在tomcat下catalina.sh中最上边添加

         -Djava.security.egd=file:/dev/random或者 -Djava.security.egd=file:/dev/urandom

2.      修改jvm的计算方式

修改配置文件java.security 在jvm_home\jre\lib\security

参数securerandom.source=file:/dev/urandom

/dev/random 是堵塞的,在读取随机数的时候,当熵池值为空的时候会堵塞影响性能,尤其是系统大并发的生成随机数的时候,如果在随机数要求不高的情况下,可以去读取/dev/urandom

整个流程如下:

JAVA中首先读取系统参数java.security.egd,如果值为空的时候,读取java.security配置文件中的参数securerandom.source, 在通常情况下,就是读取参数securerandom.source,默认值是/dev/urandom,也就是因该是不堵塞的。

但实际情况是,在测试linux环境下的时候,你会发现默认值却是堵塞的。

分享到:
评论

相关推荐

    DES加密解密(适用的Windows和Linux系统),防止Linux的下解密失败工具类

    这个DESEncrypt工具类是针对Windows和Linux系统设计的,确保在不同操作系统下都能进行一致的加密和解密操作,避免因环境差异导致的解密失败问题。主要关注点在于如何在不同系统中生成一致的随机数种子,以确保加密...

    JAVAAES加解密在linux中的问题.pdf

    Java AES 加解密在Linux环境中的问题主要集中在加解密过程中的不兼容性,这通常是由平台差异或安全参数配置不当引起的。在Windows系统上能够正常进行加解密,但在Linux系统中出现解密异常,报错信息为“Given final ...

    java中使用公钥加密私钥解密原理实现license控制

    Java 中使用公钥加密私钥解密原理实现 License 控制是指在 Java 应用程序中使用公钥加密、私钥解密机制来实现 License 文件的控制。这种机制可以用来限制系统的使用,例如限制试用期、限制用户数量、限制 IP 地址等...

    带有SecureRandom补丁的Android加密库。.zip

    `SecureRandom`类是Java和Android中用于生成随机数的重要工具,它通常被用于密码学中的密钥生成、初始化向量(IV)的创建以及其他安全性相关的需求。然而,原生的`SecureRandom`在某些版本的Android上可能存在性能...

    Java实现AES加密和解密算法

    在Java中实现AES(Advanced Encryption Standard)加密和解密算法主要涉及到对称密钥加密技术。AES算法是一种块密码,采用固定大小的128位(16字节)块进行加密和解密,支持128、192和256位的密钥长度。在给定的代码...

    java加密算法实现

    在Java编程语言中,加密算法是信息安全领域的重要组成部分,用于保护数据的隐私和安全。本文将详细介绍Java中常见的加密算法的实现,以及如何在JDK 1.8环境下进行操作。 1. **对称加密算法** 对称加密是最基础的...

    AES在windows下正常加解密,Linux下加密正常,解密异常(javax.crypto.BadPaddingExcepti

    * 该实现在 windows 上每次生成的 key 都相同, * 但是在 solaris 或部分 linux 系统上则不同。 * 所以 SecureRandom securerandom = new SecureRandom(tohash256Deal(key)); 替换为下面内容 * 以适应linux的...

    Java实现url加密处理的方法示例

    在Java中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 类可用于Base64编码和解码,但需要注意的是,这些类不是Java标准库的一部分,可能在某些Java版本中不可用。推荐使用Java 8引入的`java.util.Base64...

    openssl rc4 java 实现

    3. **Java中的加密API**:Java提供了`java.security.SecureRandom`类生成随机数,`javax.crypto.Cipher`类进行加密和解密操作。RC4在Java中属于`Cipher`类的一部分,可以通过`Cipher.getInstance("RC4")`获取。 4. ...

    Java 2 平台安全技术——结构, API 设计和实现

    在实现层面,Java使用了两种主要的技术:权限(Permissions)和访问控制上下文(Access Control Context)。权限代表了一种系统资源或操作的访问权,每个权限都有一个名称和一个类别。访问控制上下文则是当前线程的...

    解决任Weblogic 在Linux启动慢的问题

    可以修改 Linux 上 Weblogic 使用的 JDK 的安全配置文件 $JAVA_HOME/jre/lib/security/java.security,将“securerandom.source=file:/dev/urandom”修改为“securerandom.source=file:/dev/./urandom”。...

    前端使用jsencrypt加密后端使用java RSA解密功能实现源码

    在IT行业中,安全通信是至关重要的,特别是在前端与后端之间的数据交互。本文将详细介绍一个实际案例:如何在前端使用JavaScript库`jsencrypt`进行RSA加密,并在后端使用Java进行解密。这个功能实现的核心知识点包括...

    java使用google身份验证器实现动态口令验证的示例

    "java 使用 Google 身份验证器实现动态口令验证的示例" 本篇文章主要介绍了使用 Java 语言实现 Google 身份验证器来实现动态口令验证的示例代码。Google 身份验证器是一种基于时间的单次密码(TOTP)算法,能够生成...

    Java实现的AES程序

    在Java中实现AES加密,我们可以利用Java Cryptography Extension (JCE) 提供的相关类库。 AES加密的基本步骤包括: 1. **密钥生成**:AES支持128位、192位和256位三种密钥长度。在Java中,我们可以使用`javax....

    Java编程实现同步序列密码的加密解密系统

    在Java中,我们可以使用`java.security.SecureRandom`类来生成随机数,作为密钥流的种子。同时,我们可以自定义一个类,如`StreamCipher`,用于管理加密和解密过程。`StreamCipher`类需要包含以下关键方法: 1. **...

    java实现的des算法

    ### Java 实现 DES 加密解密算法详解 #### 一、引言 DES(Data Encryption Standard,数据加密标准)是一种广泛使用的对称加密算法。它最初由IBM开发,并于1977年被美国国家标准局采纳为官方加密标准。DES算法使用...

    Https请求工具类,Java实现http请求,https请求

    在Java中,使用HttpURLConnection类可以实现Http和Https请求,但是对于Https请求,需要进行SSL验证,以确保数据的安全性。下面我们将详细介绍如何实现Https请求的工具类。 首先,需要引入相关的Java包,包括java....

    简单的RSA加密算法(JAVA实现的)

    在Java中,我们可以使用Java Cryptography Extension (JCE) 来实现RSA的加解密操作。JCE是Java平台的一部分,它提供了一套强大的加密API,包括对称、非对称以及哈希算法。 首先,我们需要生成RSA密钥对。这通常通过...

    JAVA 2平台安全技术-结构,API设计和实现

    Java 2平台安全技术是Java开发中的核心领域,它涵盖了如何在Java环境中构建安全、可靠的软件系统。这个主题包括了Java安全模型的结构、API的设计与实现,以及相关的安全策略和管理机制。以下是对这些知识点的详细...

    ApigeeEdge-Java-SecureRandom:使用java.security.SecureRandom在Apigee Edge策略内生成伪随机数的Java标注

    标注使用java.security.SecureRandom在策略Apigee Edge代理内生成随机数(int,UUID或高斯值),并使用该信息设置上下文变量。免责声明此示例不是正式的Google产品,也不是正式的Google产品的一部分。使用此标注您...

Global site tag (gtag.js) - Google Analytics