Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Crypt(3)和CryptoJS的不同输出_Javascript_C_Mariadb_Cryptojs_Crypt - Fatal编程技术网

Javascript Crypt(3)和CryptoJS的不同输出

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

我正在使用以下方法对MariaDB中的密码进行哈希运算:

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)使用的编码是什么?它是标准的还是选定的字符集

  • 有没有办法比较用两个不同字符集生成的散列?我的意思是,它们是否共享散列密码的底层表示形式?我可以访问它吗

  • 我如何知道每个函数进行了多少次循环?有没有不检查源代码就知道的方法

  • 在使用CryptoJS时,我预先准备salt的假设正确吗


  • 我不会将其作为答案发布,因为我不确定,但我怀疑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);`