Java 的 sha1 加盐 加密和 node 实现的加密值不一样。

2017-12-19 19:58:47 +08:00
 dennisge

通过 java 的 sha1 加 salt 加密,和 node crypto 生成的加密值不一致。有踩过坑的吗?

9551 次点击
所在节点    Node.js
55 条回复
neoblackcap
2017-12-19 22:27:25 +08:00
在一段时间我曾经写过多种语言的客户端校验模块,曾用了多种语言自带的 sha1 等实现。针对题主的问题,我只能很肯定地说你写错了。
我只能猜你那 digest 函数出问题了,你那多次的迭代是干嘛的?我没看到 node 版本有多次迭代,你若要比较请给出你的迭代参数 iterations
superhan
2017-12-19 22:49:37 +08:00
dennisge
2017-12-19 23:22:12 +08:00
@zhicheng 望指教
dennisge
2017-12-19 23:22:38 +08:00
@sagaxu 哈哈
dennisge
2017-12-19 23:24:42 +08:00
@neoblackcap 上面的 java 实现,是先人的代码,我也不清楚那个多个迭代的作用。iterations 是 1024。不懂 java,所以没理解透。
dennisge
2017-12-19 23:27:29 +08:00
@superhan 看了您发的这个,学习了。但和我的场景有些不一样。以前他们 java 生成的密码加密值,现在用 node 得不到。你给的例子,salt 的都是 string 的,而这里 salt 是一个 bytes [], 这个会有关系吗?
zhicheng
2017-12-19 23:43:03 +08:00
@dennisge 你写错了,不要怀疑语言,不要怀疑算法,不要怀疑类库,不要找借口,不要说这是坑。

没有什么可指教的,就是调用一个函数的事儿,我不知道这种事情怎么“指教”,要是还不懂,就把上边那句话再念一遍。

Java
```
import java.security.MessageDigest;
import javax.xml.bind.DatatypeConverter;

class a {
public static void main(String args[]) {
String str = "a123456";
String salt = "af350c3413179ab4";
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(DatatypeConverter.parseHexBinary(salt));
md.update(str.getBytes());
System.out.println(DatatypeConverter.printHexBinary(md.digest()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
JS
```
crypto = require('crypto');
const str = 'a123456';
const salt = new Buffer('af350c3413179ab4', 'hex');

console.log(crypto.createHash('sha1').update(salt).update(str).digest('hex'));
```
Python
```
import hashlib
print hashlib.sha1('af350c3413179ab4'.decode('hex') + 'a123456').hexdigest()
```
dennisge
2017-12-19 23:51:22 +08:00
@zhicheng 感谢您的回答,但是您能得到这个最终的加密值吗? 79893503e8074330321974fa14dc44f8aa1b3df0。 我感觉和你用的方法没啥不一样啊,但就是得不到最后的值。是不是和原 java 实现的
for (int i = 1; i < iterations; i++) {
digest.reset();
result = digest.digest(result);
}
有关系?
dennisge
2017-12-20 00:00:03 +08:00
@zhicheng 如果只是你说的简单的方法,我觉得结果早就出来了。如果你能得到上面的这个加密值,那我闭嘴.
neoblackcap
2017-12-20 00:02:10 +08:00
@dennisge 我看你这 Java 实现是对加盐并 sha1 处理一次后的二进制流再进行了 1024 次的 sha1 迭代。你试试用 node 版本对你现在的结果再进行 1024 次 sha1 看看
dennisge
2017-12-20 00:05:19 +08:00
@neoblackcap java 是以前别人的代码。并没有理解透。能麻烦您你解释下吗
zhicheng
2017-12-20 00:06:45 +08:00
@dennisge 我并不想打击你,这真的是一眨眼,一个函数调用的事儿。

```
import hashlib
result = hashlib.sha1('af350c3413179ab4'.decode('hex') + 'a123456').digest()
for i in range(1, 1024):
result = hashlib.sha1(result).digest()

print result.encode('hex')
```
79893503e8074330321974fa14dc44f8aa1b3df0
dennisge
2017-12-20 00:07:44 +08:00
@zhicheng 你用 node 试试?
zhicheng
2017-12-20 00:08:31 +08:00
@dennisge 付钱不?
dennisge
2017-12-20 00:10:10 +08:00
@zhicheng O(∩_∩)O 哈哈~,太感谢你了。你真的太好了~~~看了你的微博,送书计划真的很赞
dennisge
2017-12-20 00:32:55 +08:00
@zhicheng 不过我刚用 node 实现一遍,还是不一样哦,结果不对。
const crypto = require('crypto');

const salt = 'af350c3413179ab4';
const saltStr = new Buffer(salt, 'hex').toString('utf8');
console.log(saltStr);
let result = crypto.createHash('sha1').update(saltStr + 'a123456').digest('hex');
for (let i = 1; i <= 1024; i++) {
result = crypto.createHash('sha1').update(result).digest('hex');
}

console.log(result);
lcdtyph
2017-12-20 01:12:38 +08:00
@dennisge 你这个 node 循环了 1024 次,上面 java 循环了 1023 次
ryd994
2017-12-20 03:40:49 +08:00
循环 hash1024 次,真是意义不明
反复 hash 只会减小值域不可能增加
初中数学去哪了?
ryd994
2017-12-20 03:44:40 +08:00
还有,就算是 1024 次 sha1 也是快的一比
bcrypt 调调难度系数,分分钟超过你的兔子算法
密码储存讲究的是慢,才能避免字典攻击
dennisge
2017-12-20 08:28:27 +08:00
@lcdtyph 恩,1023 的也不好用。上面复制的之前的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416086

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX