如何在C和ubuntu中用salt加密SHA512哈希?

如何在C和ubuntu中用salt加密SHA512哈希?,c,hash,sha512,C,Hash,Sha512,我想用盐加密散列 在命令行中,我发现使用下面的命令在阴影文件中写入了正确的哈希 openssl密码-6-salt abcd应用程序 $6$abcd$VIWAP1OZUGO376CRKZ5DXCGI8KILNUIBSK.iydtfCFqb9okOz.S70Ysu7.qRRg9Me5XwAyTjkZBQJXiIxwpL/ 我尝试使用openssl在C中获取它 但生成的哈希是EA1D5A8B1297D20F954A3AB15092D21B733484B2EB9B7226B2B138639F0DF306

我想用盐加密散列

在命令行中,我发现使用下面的命令在阴影文件中写入了正确的哈希

openssl密码-6-salt abcd应用程序 $6$abcd$VIWAP1OZUGO376CRKZ5DXCGI8KILNUIBSK.iydtfCFqb9okOz.S70Ysu7.qRRg9Me5XwAyTjkZBQJXiIxwpL/

我尝试使用openssl在C中获取它

但生成的哈希是EA1D5A8B1297D20F954A3AB15092D21B733484B2EB9B7226B2B138639F0DF306277749458A774EB279CD83D2E977A2BC5599606D6A9A3B2F075F9B1895ECD,这与正确的东西不同

我想我盐用得不好。此外,似乎还有一个根本性的问题。
我不能用C语言用salt实现加密程序吗?

您可以在GitHub上找到openssl passwd命令的源代码,特别是核心do_passwd函数:

非常不平凡的290行SHA-512 passwd散列计算函数位于稍高的位置


您最好将应用程序中的openssl passwd作为子进程调用。

您可以在GitHub上找到openssl passwd命令的源代码,尤其是核心do_passwd函数:

非常不平凡的290行SHA-512 passwd散列计算函数位于稍高的位置


您最好将应用程序中的openssl passwd作为子进程调用。

您尝试生成的不是普通的SHA-512哈希。这是一个使用基于SHA-512的专用算法的哈希密码。openssl passwd计算此算法,但openssl库的SHA512函数计算普通SHA-512。此特殊用途的算法以及其他几个具有相同功能的算法都记录在中

您可能可以使用该函数,因为历史原因,该库的名称不准确;它只提供密码散列算法,以使用与openssl passwd相同的专用算法计算散列密码。在我的计算机上,此程序打印的字符串与您得到的相同,以$6$abcd开头:

包括 包括 包括 int mainvoid { 结构加密数据光盘; memset&cd,0,大小为cd; putscrypt_rapple,$6$abcd,&cd; 返回0; } 请注意,我链接到的文档中称为设置字符串的第二个参数如何包含salt值abcd和前缀$6$,它告诉crypt\u r使用基于SHA-512的散列。它的工作方式是这样的,login1可以使用它刚刚从tty读取的密码作为第一个参数调用crypt_r,并使用来自影子文件的密码条目作为第二个参数,如果它返回它作为第二个参数输入的相同字符串,则用户已成功地进行身份验证

像这样编译和运行:

$gcc-std=gnu11-O test.c-lcrypt $test$./a.out='6$abcd$vIWAp1OzuGuo376cRkZ5DXcgI8KIlnUibsk.iydtfcffqb9okoz.S70Ysu7.qrrg9me5xwaytjkzbqxiixwpl/';回声$? 0 我这么说可能是因为这个库支持的一组特殊用途的哈希算法在不同的Unix中有所不同。如果且仅当您可以将字符串$6$abcd$。。。在/etc/shadow中输入某个帐户的密码,然后使用password应用程序以该帐户的身份成功登录,那么它应该可以工作

libcrypt还可能有一个名为的函数,可用于生成设置字符串并选择适当的哈希算法。下面是该功能的演示:

包括 包括 包括 int mainvoid { 字符设置[CRYPT_GENSALT_OUTPUT_SIZE]; crypt_gensalt_rn0,0,0,0,设置,crypt_gensalt_输出_大小; 结构加密数据光盘; memset&cd,0,大小为cd; putscrypt_rapple、setting和cd; 返回0; } 如果编译并运行此程序,它将不会打印以$6$abcd开头的字符串;它将打印其他内容,例如

$y$j9T$0aVoGQ/PFN0PHbcYlKZdZ1$05NbMJLbRliM7fmtSAeZoy3OoRsBqETpAZXQpnPey82 每次运行它时,它打印的内容都会改变,但它输出的每个字符串都可以用作/etc/shadow条目,允许用户使用password appple登录。您可以使用我保留在0的前四个参数来控制它的行为


披露:我是libxcrypt的作者之一。

您试图生成的不是普通的SHA-512哈希。这是一个使用基于SHA-512的专用算法的哈希密码。openssl passwd计算此算法,但openssl库的SHA512函数计算普通SHA-512。此特殊用途的算法以及其他几个具有相同功能的算法都记录在中

您可能可以使用该函数,因为历史原因,该库的名称不准确;它只提供密码散列算法,以使用与openssl passwd相同的专用算法计算散列密码。在我的计算机上,此程序打印的字符串与您得到的相同,以$6$abcd开头:

包括 包括 包括 int mainvoid { 结构加密数据光盘; 模因 t&cd,0,cd的大小; putscrypt_rapple,$6$abcd,&cd; 返回0; } 请注意,我链接到的文档中称为设置字符串的第二个参数如何包含salt值abcd和前缀$6$,它告诉crypt\u r使用基于SHA-512的散列。它的工作方式是这样的,login1可以使用它刚刚从tty读取的密码作为第一个参数调用crypt_r,并使用来自影子文件的密码条目作为第二个参数,如果它返回它作为第二个参数输入的相同字符串,则用户已成功地进行身份验证

像这样编译和运行:

$gcc-std=gnu11-O test.c-lcrypt $test$./a.out='6$abcd$vIWAp1OzuGuo376cRkZ5DXcgI8KIlnUibsk.iydtfcffqb9okoz.S70Ysu7.qrrg9me5xwaytjkzbqxiixwpl/';回声$? 0 我这么说可能是因为这个库支持的一组特殊用途的哈希算法在不同的Unix中有所不同。如果且仅当您可以将字符串$6$abcd$。。。在/etc/shadow中输入某个帐户的密码,然后使用password应用程序以该帐户的身份成功登录,那么它应该可以工作

libcrypt还可能有一个名为的函数,可用于生成设置字符串并选择适当的哈希算法。下面是该功能的演示:

包括 包括 包括 int mainvoid { 字符设置[CRYPT_GENSALT_OUTPUT_SIZE]; crypt_gensalt_rn0,0,0,0,设置,crypt_gensalt_输出_大小; 结构加密数据光盘; memset&cd,0,大小为cd; putscrypt_rapple、setting和cd; 返回0; } 如果编译并运行此程序,它将不会打印以$6$abcd开头的字符串;它将打印其他内容,例如

$y$j9T$0aVoGQ/PFN0PHbcYlKZdZ1$05NbMJLbRliM7fmtSAeZoy3OoRsBqETpAZXQpnPey82 每次运行它时,它打印的内容都会改变,但它输出的每个字符串都可以用作/etc/shadow条目,允许用户使用password appple登录。您可以使用我保留在0的前四个参数来控制它的行为


披露:我是libxcrypt的作者之一。

你不加密散列,不管有没有盐,首先…@AKX你的意思是它只是创建一个散列?不,你不能只是连接。注意散列的开头$6美元abcd$。6对应于您命令中的-6,之后,您就有了明文形式的salt。@klutt如果我可以使用salt计算散列,我就不能在创建散列之前连接$6$abcd$吗?@Guk不知道。我刚才告诉过你为什么你的方法行不通你不加密散列,有盐或没有盐,首先…@AKX你的意思是它只是创建一个散列?不,你不能只是连接。注意散列的开头$6美元abcd$。6对应于您命令中的-6,之后,您就有了明文形式的salt。@klutt如果我可以使用salt计算散列,我就不能在创建散列之前连接$6$abcd$吗?@Guk不知道。我刚才告诉过你为什么你的方法行不通非常感谢。我去看看,谢谢!我去看看。非常感谢!我想我在某种程度上理解了这篇文章的内容。代码已成功运行!由于gcc错误,我将crypt_rapple、$6$abcd编辑为crypt_rapple、$6$abcd、&cd。这对我帮助很大!!哦,是的,那是我的错误。非常感谢你!我想我在某种程度上理解了这篇文章的内容。代码已成功运行!由于gcc错误,我将crypt_rapple、$6$abcd编辑为crypt_rapple、$6$abcd、&cd。这对我帮助很大!!哦,是的,那是我的错误。
#include <openssl/sha.h>
#include <stdio.h>
#include <string.h>

int main() {
        char data[] = "abcdapple";
        unsigned char hash[SHA512_DIGEST_LENGTH*2+1];
        SHA512((unsigned char *)&data, strlen(data), (unsigned char *)&hash);

        char buffer[SHA512_DIGEST_LENGTH*2+1];
        for(int i =0; i < SHA512_DIGEST_LENGTH; ++i)
                sprintf(&buffer[i*2],"%02x", (unsigned int)hash[i]);
        printf("digest: %s\n", buffer);
        printf("\n");
}