【问题标题】:SHA256 using Openssl causes segmentation fault使用 Openssl 的 SHA256 导致分段错误
【发布时间】:2017-06-27 17:23:06
【问题描述】:

我正在尝试使用 AES 并基于前向保密原则通过计算新的加密密钥(即旧密钥的哈希)来加密文件。所以我使用哈希函数 SHA256 的 openssl 实现。 首先我想用这个简单的代码来测试它的可行性:

#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

 int main()
 {
     unsigned char *key =(unsigned char *)"01234567890123456789012345678901";
     SHA256(key, strlen(key), key);
     return 0;
  }

但是发生分段错误可能是什么原因?

【问题讨论】:

    标签: c hash segmentation-fault


    【解决方案1】:

    您的字符串文字被放置在只读内存中,当 openssl 尝试写入它时,您的程序会出现分段错误。

    在语言方面,尝试修改字符串文字会导致未定义的行为。

    为您的输入键创建一个缓冲区或为输出创建一个新缓冲区。

    【讨论】:

    • 你怎么知道它在只读内存中? PC 通常只有一个只读的引导/BIOS 闪存,其余的是 RAM。用户可以自行决定不更改字符串文字,它不是由实现强制执行的。
    • @Olaf 通过将数据放置在受只读访问权限保护的虚拟内存区域中来强制执行。不是作为安全措施,而是为了程序的安全。当然,如果需要使用 mprotect/VirtualProtect,进程本身有足够的权限来更改此保护。
    • 请提供C标准有这样要求的参考。在那之前:这只是UB;在可能不了解环境的情况下不知道具体发生了什么。请注意,标准明确提到了一个可以修改字符串文字的扩展(我们也不知道,所以让我们把它留在 UB)。
    • @Olaf 我想我很清楚地将我的答案分为对他的错误的解释和标准所说的内容。
    【解决方案2】:

    C 字符串文字实际上是char const*(尽管出于兼容性原因,从技术上讲,它们是char *)。你不应该写信给他们。如果你这样做了,你的程序的行为将是不确定的。

    不管怎样,SHA256 来自 #include &lt;openssl/sha.h&gt; 是:

    unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md);
    

    所以要使用它,你应该这样做:

    char const *key = "01234567890123456789012345678901";
    unsigned char buf[256/CHAR_BIT]; //or SHA256_DIGEST_LENGTH
    SHA256((unsigned char const*)key, strlen(key), buf);
    

    然后您可以使用以下命令打印结果:

     for(int i=0;i<sizeof(buf);i++)
         printf("%.2hhx", buf[i]);
    

    (假设 8 位字符)。

    【讨论】:

    • 感谢您的回答,但在这种情况下,我想以递归方式对密钥进行哈希处理,下一个密钥是实际密钥的哈希,这里的问题是 SHA256 的输入和输出是不同的类型。
    • @Amed:对哈希应用相同的哈希算法没有意义。您认为要解决什么问题?
    • @Olaf 我想在哈希上应用哈希以获得前向保密:新密钥是旧密钥的哈希,依此类推。我正在使用这个新密钥来加密数据,然后生成新密钥,它是旧密钥的哈希 ....
    • @Amed:我不确定这是 SHA 的好方法。通常一种用途,例如AES 来获得这样的伪随机数。但这听起来一般来说是个坏主意:如果一个密钥坏了,如果你知道算法,你就可以从那个密钥中获取下一个密钥(并且默默无闻的保密永远不会真正起作用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多