MessageDigest 使用注意,并发问题
来源:互联网 发布:移动光纤网络机房在哪 编辑:程序博客网 时间:2024/05/29 13:21
说一下最近在开发过程中遇到加密相关的问题,先引用一段MD5的解释。
百度百科 MD5
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
需求:每次请求对请求体进行MD5值计算,服务端做验证并响应(虽然此功能并没什么用,但是需求提出来了,就是要做)。
开发:因为这些常用的工具类之前都写好了,用的时候没有多想就直接Copy过来了,请求是并发的,刚刚开始的时候,并发请求较少(1-2)个,没有出现什么问题,后来请求3-4个同时发的时候,服务端偶尔抛出MD5值验证错误的信息,后来翻看了MD5工具类之后才发现,原来这个类写的方式并不支持并发,MessageDigest被声明为成员变量,多线程环境下会共享同一个MessageDigest对象,为什么共享它在并发情况会出问题呢?
查看MessageDigest源码
/** * Updates the digest using the specified array of bytes. * * @param input the array of bytes. */ public void update(byte[] input) { engineUpdate(input, 0, input.length); state = IN_PROGRESS; }
可以看到这里调用了engineUpdate方法,此方法进行一个更新操作。
Updates the digest using the specified array of bytes, starting at the specified offset.
然后state属性的状态就被改变了,表明当前计算正在处理过程中。
state默认属性
private int state = INITIAL;
然后需要调用MessageDigest.digest()方法计算哈希值
/** * Completes the hash computation by performing final operations * such as padding. The digest is reset after this call is made. * * @return the array of bytes for the resulting hash value. */ public byte[] digest() { /* Resetting is the responsibility of implementors. */ byte[] result = engineDigest(); state = INITIAL; return result; }
到这里已经完成了MD5值的计算,state属性恢复初始状态,如果想要重用MessageDigest对象,还需要调用MessageDigest.reset()方法进行重置,以免这次计算数据会对下一次的计算造成影响,从而导致计算结果错误。
而我所遇到的问题就是,在MessageDigest在多线程的环境下,Thread-1的计算还没有完成的情况下,Thread-2又开始使用该MessageDigest对象进行下一次的计算,Thread-2修改了MessageDigest的状态,Thread-1使用被修改过后的MessageDigest进行计算,从而导致了计算结果错误。
- MessageDigest 使用注意,并发问题
- 使用MessageDigest生成MD5的问题
- j2ee高并发时使用全局变量需要注意的问题
- MessageDigest类的使用
- MessageDigest简介及使用
- MessageDigest
- MessageDigest
- MessageDigest
- MessageDigest
- java.security.MessageDigest的使用
- 使用MessageDigest 完成MD5加密
- java.security.MessageDigest的使用
- 使用MessageDigest来实现MD5
- 大并发量需要注意的问题
- java并发编程(一)-并发编程需要注意问题
- 使用指针注意问题
- VSS使用注意问题
- crontab使用注意问题
- uabntu下安装opencv
- 第一周-机器学习-梯度下降(gradient descent)
- Tmux的日常使用
- 邮件服务系列(四)
- [Leetcode] 54. Spiral Matrix 解题报告
- MessageDigest 使用注意,并发问题
- 集合框架_统计字符串中每个字符出现的次数案例图解
- 新建maven项目
- attr( ) prop 获取 input 的 checked属性值(特殊)
- Android中日期选择器之DatePickerDialog对话框
- WinterEx.监测点
- Java通信之客户端的创建以及客户端和服务器的简单交互
- Git和Github的基本使用
- sql server 2008 r2中用alter修改表结构---给属性加上unique约束