Javascript Crypt(3)和CryptoJS的不同输出
我正在使用以下方法对MariaDB中的密码进行哈希运算:Javascript Crypt(3)和CryptoJS的不同输出,javascript,c,mariadb,cryptojs,crypt,Javascript,C,Mariadb,Cryptojs,Crypt,我正在使用以下方法对MariaDB中的密码进行哈希运算: ENCRYPT('password',CONCAT('6$',子字符串(SHA(RAND()),-16)) 这会产生如下结果: $6$3b502db443d64283$BNSYWsf3T0e4xT23GJW/QPpKvzLidio5zk9v7kCE.wk4dtNo4avMzBxvqoWc0Y5ihj/ZVWTGCWZRFT00BNI1 这里的格式是$6意思是SHA512,然后是$salt$,然后是计算出的密码散列 BNSYWsf3T0e4
ENCRYPT('password',CONCAT('6$',子字符串(SHA(RAND()),-16))
这会产生如下结果:
$6$3b502db443d64283$BNSYWsf3T0e4xT23GJW/QPpKvzLidio5zk9v7kCE.wk4dtNo4avMzBxvqoWc0Y5ihj/ZVWTGCWZRFT00BNI1
这里的格式是$6
意思是SHA512,然后是$salt$
,然后是计算出的密码散列
BNSYWsf3T0e4xT23GJW/QPpKvzLidio5zk9v7kCE.wk4dtNo4avMzBxvqoWc0Y5ihj/ZVWTGCWZRFT0BNI1
据我所知,这在后台使用crypt(3)。如果我写一小段C,例如:
#define _GNU_SOURCE
#include <crypt.h>
#include <stdio.h>
int main() {
char * blah = crypt("password", "$6$3b502db443d64283");
puts(blah);
}
我在密码前加了salt,因为此函数只接受一个参数。结果是:
105865BA5BF0649410927131204A1228260E59E95B1B5394001B98835DCA4AEDFE7039A00060FDBA8531C44C83CD3B7BEC44864865915938D2ED7ED477254F61
好的。我知道这是散列密码的十六进制编码。所以我将更改编码…但改为什么?我将尝试Base64:
`console.log(SHA512("3b502db443d64283password")).toString(CryptoJS.enc.Base64);`
输出为:
efhlulvwzjqknexieoskcyowellbg1ouiag5idxcpk7f5woaaayp26hthetipno3vssgsgwrwtjs7x7udyvpyq==
我开始发现一个问题。crypt(3)使用的编码不是base64。它是什么?我在手册页中查看:
“salt”和“encrypted”中的字符是从集合中提取的
[a-zA-Z0-9./]
所以我只剩下这些问题:
我不会将其作为答案发布,因为我不确定,但我怀疑crypt(3)使用了(参见第一个链接的项目符号)。因此,从0-63的顺序:
[./A-Za-z]
,没有填充。转换为“Base64”或从“Base64”转换为一个简单的tr
(或等效),然后添加(或删除)填充。编码也不是SHA-512。它是基于SHA的迭代编码。SHA单独不能用于al的任何类型的安全密码散列,不管是不是SALT,所以。@TimČas这看起来是一个很好的线索。看起来很可能是B64编码(一点也不令人困惑!)。我还没有找到必要的转置,但如果我认为你是对的,那么应该也可以从B64生成十六进制值。@TimČas源代码说你是对的:@DanielC:我想说(如果有什么的话)这是Base64中的一个缺陷,而不是在crypt(3)中。我可以找到引用B64编码的文档,也就是说,B64很可能早于Base64。以下是一个注明日期的源:。
`console.log(SHA512("3b502db443d64283password")).toString(CryptoJS.enc.Base64);`