bcrypt java_java – BCrypt性能恶化

Problem: It appears that when the server is restarted, the Bcrypt.hashpw takes

100ms to decrypt password. However after some time (there is no pattern)

suddenly the Bcrypt.hashpw performance spikes up from 100ms to 10s of seconds.

There is no obvious reason for this.

问题是/ dev / random有时会阻塞,当它这样做会显得是随机的:)更令人困惑的是,当试图测试它的工作原理时,你会跑到观察者效应,即在试图观察随机行为你会产生熵,这可能会导致一大堆混乱,即我的结果不会与你的等同.这也是为什么它看起来没有模式.

我将演示该问题,并向您展示如何在自己的服务器上重新创建(在原因之内),以便您可以测试解决方案.我会尝试并提供几个修复程序,请注意这是在Linux上,但同样的问题将发生在需要熵生成随机数并耗尽的任何系统上.

在Linux / dev / random是一个随机字节流.当你从中读到

流消耗可用的熵.当达到某一点时

从/ dev / random block读取.您可以使用此命令查看可用的熵

cat /proc/sys/kernel/random/entropy_avail

如果你运行下面的bash脚本,还要监视熵_avail,你会

注意到熵脚随着bash脚本的消耗而急剧下降.

while :

do

cat /dev/random > /dev/null

done

这也应该提供一个关于如何在你的服务器上重新创建这个问题的提示,即运行上面的bash脚本来减少可用的熵,问题将会显现出来.

如果你想看到你的系统每秒创建几个字节

可以使用pv测量,即

pv /dev/random

如果你离开pv运行它有一个效果,它消耗随机的字节流,这意味着其他服务可能会开始阻止.请注意,pv也显示它的输出,所以它也可能会增加系统上的可用entroy :).

在使用pv / dev / random的熵较小或无熵的系统上,似乎很慢.我也经历过虚拟机有时会产生熵的主要问题.

要重新创建问题,请使用以下类…

import java.security.SecureRandom;

import org.mindrot.jbcrypt.BCrypt;

public class RandTest {

public static void main(String[] args) {

SecureRandom sr = new SecureRandom();

int out = 0;

String password = "very-strong-password-1729";

String hashed;

for (int i = 0; i < 200000 ; i++) {

hashed = BCrypt.hashpw(password, BCrypt.gensalt());

//If we print, we're generating entroy :) System.out.println(hashed);

}

}

}

我将bcrypt下载到本地目录.我编译并运行如下

javac -cp ./jBCrypt-0.4/src/ RandTest.java

java -cp ./jBCrypt-0.4/src/:. RandTest

如果您在运行RandTest时从较早版本运行bash脚本,那么系统阻塞等待更多熵时,您会看到很大的暂停.如果你运行strace,你会看到以下内容…

1067 [pid 22481] open("/dev/random", O_RDONLY|O_LARGEFILE) = 12

11068 [pid 22481] fstat64(12, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 8), ...}) = 0

11069 [pid 22481] fcntl64(12, F_GETFD) = 0

11070 [pid 22481] fcntl64(12, F_SETFD, FD_CLOEXEC) = 0

.....

11510 [pid 22481] read(12, "\320\244\317RB\370", 8) = 6

该程序正在从/ dev / random读取.测试熵的问题是

您可能会在尝试测试它时产生更多的观察效果.

修复

第一个修复是从/ dev / random转换为/ dev / urandom ie

time java -Djava.security.egd=file:///dev/./urandom -cp ./jBCrypt-0.4/src/:. RandTest

另一种修复方法是将/ dev / random设备重新创建为/ dev / urandom设备.你可以从man页面找到如何做,而不是创建它们…

mknod -m 644 /dev/random c 1 8

mknod -m 644 /dev/urandom c 1 9

chown root:root /dev/random /dev/urandom

我们删除一个并假冒它ie

rm /dev/random

mknod -m 644 /dev/random c 1 9

chown root:root /dev/random

/ dev / random现在实际上是/ dev / urandom

要记住的关键是测试需要从中获取的随机数据由于观察效应,您正在测试的系统很困难.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值