【问题标题】:Is there a standard way to generate a salt for crypt syscall?是否有一种标准方法可以为 crypt 系统调用生成盐?
【发布时间】:2018-01-10 17:49:18
【问题描述】:

我需要为我的应用程序实现帐户管理,我宁愿不使用chpasswd子进程,或者让明文密码离开我的应用程序的内存空间。

我想将putspent 与使用crypt 生成的密码哈希一起使用,但我找不到任何标准函数来随机化crypt 的盐。在线搜索只发现了奇怪的散列函数实现,我不想复制到我的代码中。是否有标准函数可以为我生成盐?

否则,重新使用存储在我的影子文件中的当前盐是否明智?我想不出为什么它会是一个安全隐患(它不会削弱我的影子文件以抵御彩虹表攻击),它只是感觉不对,因为在系统安全中,经验法则是总是随机化一切......(用户与系统实用程序一起添加)

【问题讨论】:

  • “标准”是什么意思?如果您指的是 POSIX,则盐只是两个随机字符,但这意味着 DES 加密——这不是一个好主意。您是否打算使用 glibc 的扩展名 crypt(),例如允许用于 SHA-256 加密?
  • 肯定重复使用盐是不明智的。此外,crypt 不是syscall,因此也不是假设的new_salt。您可以在最近的 Linuxen 上使用 getrandom 来获取盐的随机字节 - 然后用 & 63 屏蔽那些无符号字符,映射到 [a-zA-Z0-9./] 以获得盐。
  • 谢谢两位。是的,我的意思是包括 glib 在内的 POSIX/标准库。是的,我当然会使用 SHA 512。在任何标准库中是否有这样的功能?我们真的希望每次都手动编写这样的函数吗?

标签: c linux security salt crypt


【解决方案1】:

OpenSSL 为 sha512 提供功能:

https://www.openssl.org/docs/man1.0.2/crypto/SHA512.html

int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA256(const unsigned char *d, size_t n,
      unsigned char *md);

【讨论】:

  • 盐的部分是什么?还是自动集成?
  • 我被您对 SHA512 的评论误导了。我发布了另一个关于如何生成盐的答案。
【解决方案2】:

要为 crypt() 生成盐,您需要 2 个随机字节。 为此,您可以使用 openssl:

#include <openssl/rand.h>
int RAND_bytes(unsigned char *buf, int num);
int RAND_pseudo_bytes(unsigned char *buf, int num);

参考:https://www.openssl.org/docs/man1.0.2/crypto/RAND_bytes.html

例子:

unsigned char salt[2];
RAND_pseudo_bytes(salt, 2);
char *ptr = crypt(password, salt);

【讨论】:

  • 恐怕这段代码不会产生预期的结果...盐是$6$salt$形式的字符串,其中 6 表示 SHA 512,盐是 8 到 16 个字符的字符串[a-zA-Z0-9./]
猜你喜欢
  • 2011-10-06
  • 2013-12-21
  • 2012-11-13
  • 2013-09-28
  • 2014-12-13
  • 1970-01-01
  • 2022-12-04
  • 2010-10-04
  • 2010-09-08
相关资源
最近更新 更多