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

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

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

9589 次点击
所在节点    Node.js
55 条回复
sagaxu
2017-12-19 20:01:28 +08:00
那只能说明你写错了
Jaylee
2017-12-19 20:15:02 +08:00
如果要加密的字符串有中文的话,node 需要指定编码
mcfog
2017-12-19 20:17:24 +08:00
//密码学问题不要自作聪明,加盐就乖乖用 hmac 来加
dennisge
2017-12-19 20:41:47 +08:00
1. 这是原 java 的加密
a123456 => 79893503e8074330321974fa14dc44f8aa1b3df0
plainPassword = StringUtils.trim(plainPassword);
byte[] salt = Digests.generateSalt(SALT_SIZE); // af350c3413179ab4
byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS);

private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);

if (salt != null) {
digest.update(salt);
}

byte[] result = digest.digest(input);

for (int i = 1; i < iterations; i++) {
digest.reset();
result = digest.digest(result);
}
return result;
} catch (GeneralSecurityException e) {
throw Exceptions.unchecked(e);
}
}

2. node
dennisge
2017-12-19 20:45:18 +08:00
2.node
const old = 'af350c3413179ab479893503e8074330321974fa14dc44f8aa1b3df0';
const origin = 'a123456';
const saltStr = old.substring(0, 16);
const salt = new Buffer(saltStr, 'hex');

const originBuf = new Buffer(origin);
console.log('originBuf>>');
console.log(originBuf);
console.log(originBuf.length);


const encrypt1 = crypto.createHash('sha1')
.update(salt)
.update(originBuf)
.digest('hex');

const encrypt2 = crypto.createHmac('sha1', salt)
.update(originBuf)
.digest('hex');

console.log(encrypt1);
console.log(encrypt2);

=>
originBuf>>
<Buffer 61 31 32 33 34 35 36>
7
e03f07ac2befce638c5886adecbec96a06ce5a51
ab7b28b75346d63105a9bdc5a0365c1967eb132c
dennisge
2017-12-19 20:45:45 +08:00
@mcfog 用 hmac 也不一致
dennisge
2017-12-19 20:45:56 +08:00
@sagaxu 请赐教
dennisge
2017-12-19 20:46:17 +08:00
@Jaylee 没有中文,全是英文的
SlipStupig
2017-12-19 20:54:17 +08:00
我遇到过 pypy 和 python hmac 不一样过......
Liang
2017-12-19 20:55:25 +08:00
试过.net 和 java 不一样,调试了 2 天。。。
应该是我能力问题
lihongjie0209
2017-12-19 20:56:29 +08:00
盐( Salt ),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。
在大部分情况,盐是不需要保密的。盐可以是随机产生的字符串,**其插入的位置可以也是随意而定**。如果这个散列结果在将来需要进行验证(例如:验证用户输入的密码),则需要将已使用的盐记录下来。

加盐的位置是随机的.
rrfeng
2017-12-19 20:57:14 +08:00
一般来说就是参数不一致。
不同语言的库可能有不同的默认参数的,仔细看一下文档应该能解决。
dennisge
2017-12-19 20:58:55 +08:00
@lihongjie0209 解释的很详细。但是我现在就是 java 加密的密码,用相同的盐,结果 node 却解不出来
dennisge
2017-12-19 20:59:48 +08:00
@rrfeng 翻遍了代码哦,不然不会随便问问题的。通读了文档,尝试了很多次,实在没办法,才开问。
dennisge
2017-12-19 21:04:10 +08:00
我怀疑是不是 java 支持的带符号整型,而 node 不支持。af350c3413179ab4 。这个是 salt 的 hex 值,java 的 8 个字节有负数,而 node 是不支持的,这个造成了 salt 不一样???
hsuan
2017-12-19 21:38:30 +08:00
sha1 能叫加密吗
metrxqin
2017-12-19 22:07:11 +08:00
代码能贴完整点吗?
zhicheng
2017-12-19 22:12:37 +08:00
原因很简单,你写错了。
sagaxu
2017-12-19 22:17:08 +08:00
sagaxu
2017-12-19 22:18:03 +08:00
node 结点的黑底白字配色,让我这个近视加散光严重的,彻底受不了了,逃离

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

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

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

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

© 2021 V2EX