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

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

我正在尝试用salt加密哈希。

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

openssl passwd -6-盐abcd适用 $ 6 $ abcd $ vIWAp1OzuGuo376cRkZ5DXcgI8KIlnUibsk.iydtfCFqb9okOz.S70Ysu7.qRRg9Me5XwAyTjkZBQJXiIxwpL /

然后我尝试使用openssl(How to convert a raw 64-byte binary to Hex or ASCII in C)在C语言中获取它。

#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");
}

但是生成的哈希是ea1d5a8b11297d20f954a3ab15092d21b733484b2eb9b7226b2b138639f0df30627774945458a774eb279cd279d83d2e977a2bc5599606d6a9a3b2f075f9b1895ecd,与正确的事物不同。

我认为我用盐不好。似乎也存在根本问题。 我不能使用C盐实现加密程序吗?

解决方法

您尝试生成的不是普通的SHA-512哈希。这是使用基于SHA-512的专用算法散列密码openssl passwd计算该算法,但是OpenSSL库的SHA512函数计算普通的SHA-512。 crypt(5) manpage中记录了这种专用算法以及其他具有相同功能的算法。

您可以可能使用crypt_r库中的libcrypt函数(由于历史原因,该库的名称不正确;仅 提供密码哈希算法),以使用与openssl passwd相同的专用算法来计算哈希密码。在我的计算机上,该程序会以您得到的$6$abcd开头打印相同的字符串:

#include <crypt.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    struct crypt_data cd;
    memset(&cd,sizeof cd);
    puts(crypt_r("appple","$6$abcd",&cd));
    return 0;
}

请注意第二个参数(在我一直链接到的文档中称为“设置字符串”)如何同时包含盐值abcd和前缀$6$(它告诉{{ 1}}使用基于SHA-512的哈希)。它的工作方式是,crypt_r可以使用刚从tty读取的密码作为第一个参数调用login(1),并从影子文件输入的密码作为第二个参数(如果返回)与第二个参数输入的字符串相同,则用户已成功通过身份验证。

像这样编译并运行:

crypt_r

我之所以说 ,是因为该库支持的一组特殊用途的哈希算法在Unix和Unix之间有所不同。如果(且仅当)您可以将字符串$ gcc -std=gnu11 -O test.c -lcrypt $ test $(./a.out) = '$6$abcd$vIWAp1OzuGuo376cRkZ5DXcgI8KIlnUibsk.iydtfCFqb9okOz.S70Ysu7.qRRg9Me5XwAyTjkZBQJXiIxwpL/'; echo $? 0 放在$6$abcd$...的某个帐户的密码条目中,然后使用密码/etc/shadow作为该帐户成功登录后,它应该可以工作。 / p>

libcrypt可能还具有称为crypt_gensalt_rn的函数,您可以使用该函数生成设置字符串并选择适当的哈希算法。这是该功能的演示:

appple

如果编译并运行 this 程序,它将打印以#include <crypt.h> #include <string.h> #include <stdio.h> int main(void) { char setting[CRYPT_GENSALT_OUTPUT_SIZE]; crypt_gensalt_rn(0,setting,CRYPT_GENSALT_OUTPUT_SIZE); struct crypt_data cd; memset(&cd,&cd)); return 0; } 开头的字符串;它将打印其他内容,例如

$6$abcd

及其打印的内容将在每次运行时更改,但是它输出的每个字符串都可以用作$y$j9T$0aVoGQ/PFN0PHbcYlKZdZ1$05NbMJLbRliM7fmtSAeZoy3OoRsBqETpAZXQpnPey82 条目,允许某人使用密码/etc/shadow登录。您可以使用我在0处留下的前四个参数来控制其行为。

(披露:我是lib(x)crypt的作者之一。)

,

您可以在GitHub上找到openssl passwd命令(特别是核心do_passwd函数)的源代码:https://github.com/openssl/openssl/blob/8ea761bf40e6578ecd95ec47772ef86a2e4d4607/apps/passwd.c#L795-L874

(非常平凡的290行)SHA-512 passwd哈希计算函数位于https://github.com/openssl/openssl/blob/8ea761bf40e6578ecd95ec47772ef86a2e4d4607/apps/passwd.c#L509-L793的稍上方,

最好从应用程序中调用openssl passwd作为子流程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-