首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java SHA1与JavaScript SHA1的不同

Java SHA1与JavaScript SHA1的不同
EN

Stack Overflow用户
提问于 2013-06-28 08:30:45
回答 3查看 3.1K关注 0票数 2

我有点困惑。我想要获取字符串的字节数,该字符串是用SHA1散列的。

JavaScript:

代码语言:javascript
复制
var content = "somestring";
console.warn(content.getBytes().toString());
console.warn(CryptoJS.SHA1(content.getBytes().toString()).toString().getBytes());

String.prototype.getBytes = function () {
var bytes = [];
for (var i = 0; i < this.length; i++){
    bytes.push(this.charCodeAt(i));
}
return bytes;
};

Array.prototype.toString = function(){
var result = "";
for(var i = 0; i < this.length; i++){
    result += this[i].toString();
}
return result;
}

这给了我

代码语言:javascript
复制
115111109101115116114105110103
[52, 99, 97, 54, 48, 56, 99, 51, 53, 54, 102, 54, 48, 53, 50, 49, 99, 51, 49, 51, 49, 100, 49, 97, 54, 55, 57, 55, 56, 55, 98, 52, 52, 52, 99, 55, 57, 102, 54, 101]

Java:

代码语言:javascript
复制
String message = "somestring";
byte[] sha1 = MessageDigest.getInstance("SHA1").digest(message.getBytes());
System.out.println(Arrays.toString(message.getBytes()));
System.out.println(Arrays.toString(sha1));
System.out.println(new String(sha1));

这给了我

代码语言:javascript
复制
[115, 111, 109, 101, 115, 116, 114, 105, 110, 103]
[-38, 99, -5, 105, -82, -80, 60, 119, 107, -46, 62, -111, -30, -63, -53, 61, -13, 1, 53, -45]
Úcûi®°<wkÒ>‘âÁË=ó5Ó

第一个输出在JavaScript和Java上是相同的,但第二个输出是不同的。为什么以及如何像Úcûi®°<wkÒ>‘âÁË=ó5Ó这样的校验和是可能的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-28 21:01:47

以下是解决方案:

Javascript:

代码语言:javascript
复制
key = 'testKey';
var hashedKey = CryptoJS.SHA1(key);
console.log(hashedKey);

输出: 2420e186fcdb8d0ea08d82fdfbfb8722d6cbf606

Java:

代码语言:javascript
复制
password="testKey";
final MessageDigest md = MessageDigest.getInstance("SHA1");
ByteArrayOutputStream pwsalt = new ByteArrayOutputStream();
pwsalt.write(password.getBytes("UTF-8"));
byte[] unhashedBytes = pwsalt.toByteArray();
byte[] digestVonPassword = md.digest(unhashedBytes);
System.out.println(bytesToHex(digestVonPassword));

输出: 2420E186FCDB8D0EA08D82FDFBFB8722D6CBF606

除了大写字母和小写字母不同之外,输出是相同的。顺便说一下,它是十六进制的。

票数 1
EN

Stack Overflow用户

发布于 2013-06-28 08:40:22

在您的JavaScript中,您正在对一个字符串执行SHA-1,它是一个字节数组中的数字(因此与您的字符串content不同)。

代码语言:javascript
复制
console.warn(CryptoJS.SHA1(content.getBytes().toString()).toString().getBytes());
//                                              ^^

在Java语言中,您正在对一个byte[] (相当于您的字符串content)执行一个SHA-1。

代码语言:javascript
复制
byte[] sha1 = MessageDigest.getInstance("SHA1").digest(message.getBytes());
//                                                                ^^

您的toString创建的数据与您在Java语言中创建的数据截然不同。

另外(不确定是否相关):在内部,JavaScript对字符串使用UTF-16。

此外,您的JavaScript的记录输出不能是SHA-1,因为它的长度是错误的;这是因为在计算之后在sha1上重复了.toString().getBytes() (在this comment中提到了这一点)。

票数 2
EN

Stack Overflow用户

发布于 2016-10-27 20:08:19

我找到了这个图书馆。它产生与Java相同的值

https://caligatio.github.io/jsSHA/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17355421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档