swift - Glibc 的哈希函数

标签 swift linux glibc

我一直在尝试在 Swift 中加密字符串,但我希望它能在 Linux 下工作。像下面的代码这样的答案(取自 these questions 不起作用,因为它们依赖于 iOS 或 OSx 库:

func sha256(data : Data) -> Data {
    var hash = [UInt8](repeating: 0,  count: Int(CC_SHA256_DIGEST_LENGTH))
    data.withUnsafeBytes {
        _ = CC_SHA256($0, CC_LONG(data.count), &hash)
    }
    return Data(bytes: hash)
}
  • 如何在 Linux 中使用 Glibc 来完成此操作?

最佳答案

glibc中有一个crypt库,see manpage .
您需要包括:#include <crypt.h> .

您必须使用的功能是:

char *crypt(const char *key, const char *salt);

根据该联机帮助页,自 glibc 2.7 起就集成了 SHA-256 算法,并通过 salt 选择论据:

The glibc2 version of this function supports additional encryption
algorithms.

If salt is a character string starting with the characters "$id$"
followed by a string terminated by "$":

       $id$salt$encrypted

then instead of using the DES machine, id identifies the encryption
method used and this then determines how the rest of the password
string is interpreted.  The following values of id are supported:

       ID  | Method
       ─────────────────────────────────────────────────────────
       1   | MD5
       2a  | Blowfish (not in mainline glibc; added in some
           | Linux distributions)
       5   | SHA-256 (since glibc 2.7)
       6   | SHA-512 (since glibc 2.7)

So $5$salt$encrypted is an SHA-256 encoded password and
$6$salt$encrypted is an SHA-512 encoded one.

"salt" stands for the up to 16 characters following "$id$" in the
salt.  The encrypted part of the password string is the actual
computed password.  The size of this string is fixed:

MD5     | 22 characters
SHA-256 | 43 characters
SHA-512 | 86 characters

The characters in "salt" and "encrypted" are drawn from the set
[a-zA-Z0-9./].  In the MD5 and SHA implementations the entire key is
significant (instead of only the first 8 bytes in DES).

关于this official GNU pagethis wikipedia article是解释和示例:

示例 salt SHA-256 的参数:
$5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD

关于swift - Glibc 的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45996209/

相关文章:

linux - 快速、免费的工具来取消存档任何压缩格式?

linux - 中断处理程序内向外部 BMC 报告错误

来自旧硬盘系统的 mysql datadir 无法启动

快速触摸 - 如何区分物体

c - 为什么 glibc "timezone"global 与夏令时的系统时间不一致?

glibc -/lib/ld-linux.so.2 : bad ELF interpreter: No such file or directory

centos7 - 在 CentOS 7 上将 glibc 2.17 升级到 2.19+

ios - UILabel 文字颜色浅

ios - 如何在 UIStepper 中腾出空间

swift - 快速使用 Core Plot 的 3D 饼图