我一直在尝试在 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 page和 this wikipedia article是解释和示例:
示例 salt
SHA-256 的参数:
$5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
关于swift - Glibc 的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45996209/