关于 java中的SecureRandom在linux中每次生成不同结果

使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密

public static String encrypt(String content, String password) {
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, new SecureRandom(password.getBytes()));
        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);

        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(password.getBytes());
        kgen.init(128, random);

        return parseByte2HexStr(result); // 加密
    } catch (Exception e) {
        System.out.print(e);
    }
    return null;
}

原因在于加红的部分SecureRaom的生成,Linux下默认的算法是“NativePRNG”, 而windows下默认是“SHA1PRNG”(sun提供的算法)

对于这两种算法

相同点:
  1. 都是伪随即算法,
  2. 默认都是阻塞式

不同点:
  1. SHA1PRNG使用的seed是在系统启动时就指定的,而NativePRNG会在内核中随机取得(这也是Linux下每次结果不同的原因)
  2. 正是因为每次随机取,NativePRNG开销要更大些

虽然Linux认为最佳随机算法是NativePRNG(安全因素),但使用每次都变化的radom是无法正确解密的,所以并不适用于此种场合。

解决办法

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);

另外,这两种算法都是阻塞式算法,会读取/var/random,如果想非阻塞,启动时加上下面参数

Djava.security=file:/dev/urandom

参考:

http://www.cjsdn.net/Doc/JDK50/java/security/SecureRandom.html

https://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html

http://calvin1978.blogcn.com/articles/securerandom.html

https://stackoverflow.com/questions/27622625/securerandom-with-nativeprng-vs-sha1prng

原文地址:https://www.cnblogs.com/roostinghawk/p/8384057.html

时间: 2024-10-24 11:20:28

关于 java中的SecureRandom在linux中每次生成不同结果的相关文章

java中的SecureRandom在linux中的实现

在安全系统中,通常我们会使用securerandom去更安全的生成随机数,而默认的SecureRandom里使用的算法是SHA1PRNG. Linux中的随机数发生器 在Linux操作系统中,有一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器. /dev/random 在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节./dev/random可生成高随机性的公钥或一次性密码本.若熵池空了,对/dev/random的读操作将会被阻塞,直到从别的设备中收集到了足够的环境噪声

Windows中的"簇"和Linux中的"块"是对应的

扇区是对硬盘而言,块是对文件系统而言. 簇”又称为“分配单元” ,文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT 16/32/NTFS)打开文件.扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理.每个簇可以包括2.4.8.16.32或64个扇区.显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性. 为了更好地管理磁盘空间和更高效地从硬盘读取数

Linux中Too many open files 问题分析和解决

今天某个服务的日志中出现了大量的异常: [WARN ] 2018-06-15 16:55:20,831 --New I/O server boss #1 ([id: 0x55007b59, /0.0.0.0:20880])-- [org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink] [DUBBO] Failed to accept a connection., dubbo version: 2.8.3.2, current

Linux中bash shell入门

▲初探shell Shell分为图形界面shell(如win中的explorer,linux中的kDE和GNOME)和命令行shell.Shell是一个命令解释器,又分为交互式和非交互式.也可分为登陆式shell(需输入用户名和密码)和非登陆式shell Linux中支持的shell在/etc/shells文件中 Linux使用的默认shell为bash(Bourne Again Shell) ? type [-at] name????显示name是外部命令还是bash内置命令 ????参数-t

Linux中的软硬链接

说到Linux中的软硬链接,就必须谈一下Linux的文件系统的组成的重要部分iNode和block. 首先是iNode,先用一张图了解一下iNode在Linux文件系统中的地位: Linux中的文件的文件名.文件属性和文件的数据是分开存储的.文件名存放在目录项(dentry)中,文件的属性存放在iNode中,而文件的内容,即文件的实际数据存放在block中,而目录只有iNode没有block.一般而言这个iNode的大小为128B,iNode中的内容大致如下:  1.文件的字节数: 2.文件拥有

linux中各目录及详细介绍

一.Linux文件系统的层次结构 在Linux或UNIX操作系统中,所有的文件和目录都被组织成一个以根节点开始的倒置的树状结构,如图: 二.目录 1.目录的定义 目录相当于Windows中的文件夹,目录中存放的既可以是文件,也可以是其他的子目录. 文件系统层次结构标准(FHS)定义了Linux操作系统中的主要目录及目录内容. 在FHS中,所有的文件和目录都出现在根目录"/"下,即使他们存储在不同的物理设备中. 2.linux中的目录详细介绍: /   根目录 /bin/   面向所有用

如何在 Linux 中配置 sudo 访问权限

Linux 系统中 root 用户拥有 Linux 中全部控制权力.Linux 系统中 root 是拥有最高权力的用户,可以在系统中实施任意的行为. 如果其他用户想去实施一些行为,不能为所有人都提供 root 访问权限.因为如果他或她做了一些错误的操作,没有办法去纠正它. 为了解决这个问题,有什么方案吗? 我们可以把 sudo 权限发放给相应的用户来克服这种情况. sudo 命令提供了一种机制,它可以在不用分享 root 用户的密码的前提下,为信任的用户提供系统的管理权限. 他们可以执行大部分的

Linux中对目录和文件管理所使用的命令(理论部分,无图慎入!)

本次我和小伙伴们分享的是Linux系统中目录和文件管理所使用的的命令,接下来我会从以下几点和大家进行详细解析 Linux目录结构 查看及检索文件 备份及恢复文档(压缩包格式) VI文本编辑器 (一).Linux目录结构 1.树形目录结构2.根目录:? 所有分区.目录.文件等的位置起点? 整个树形目录结构中,使用独立的一个"/"表示3.常见的子目录:? /root(系统管理员的宿主目录)? /bin(所有用户可执行的命令) ? /boot(系统内核,启动文件) ? /dev(设备文件)?

Linux中文本编辑器三种工作模式切换及vi编辑器三种工作模式下命令详解

文本编辑器的作用 创建或修改文本文件维护Linux系统中的各种配置文件Linux中最常用的文本编辑器Linux中最常用的文本编辑器vi:类UNIX操作系统的默认文本编辑器vim:vim时vi文本编辑器(一般简称vi编辑器)的增强版本 vi编辑器的工作模式 三种工作模式命令模式.输入模式.末行模式不同模式之间的切换 命令模式的基本操作3-1 光标移动方向键移动(↑.↓.←.→) 功能:上下左右移动Page Down或Ctrl+F 功能:向下翻动一整页的内容Page Up或Ctrl+B 功能:向上翻