如何在swift中将字符串哈希到sha512?(代码片段)

author author     2023-05-13     767

关键词:

我正在构建一个社交媒体应用程序,我想帮助在Swift中将密码字符串编码为SHA512。我在GitHub上找到了CryptoSwift库,但我很难将它加载到我的Swift项目中并将其链接到我的项目文件。有谁知道如何相对容易地完成这个?先谢谢你,凯尔

答案

Swift 3的解决方案:

extension String 

    func sha512() -> String 
        let data = self.data(using: .utf8)!
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH))
        data.withUnsafeBytes(
            _ = CC_SHA512($0, CC_LONG(data.count), &digest)
        )
        return digest.map( String(format: "%02hhx", $0) ).joined(separator: "")
    


另一答案

我发现所有的答案都可以,但如果我们应该有一个真正的通用解决方案,我认为我们需要提升一个级别。

CC_LONG只是一个UInt32,不会支持真正的大型数据结构。

这是我在Swift 3中的解决方案:

首先,我们创建一个基础:

struct Sha512 
    let context = UnsafeMutablePointer<CC_SHA512_CTX>.allocate(capacity:1)

    init() 
        CC_SHA512_Init(context)
    

    func update(data: Data) 
        data.withUnsafeBytes  (bytes: UnsafePointer<Int8>) -> Void in
            let end = bytes.advanced(by: data.count)
            for f in sequence(first: bytes, next:  $0.advanced(by: Int(CC_LONG.max)) ).prefix(while:  (current) -> Bool in current < end)  
                _ = CC_SHA512_Update(context, f, CC_LONG(Swift.min(f.distance(to: end), Int(CC_LONG.max))))
            
        
    

    func final() -> Data 
        var digest = [UInt8](repeating: 0, count:Int(CC_SHA512_DIGEST_LENGTH))
        CC_SHA512_Final(&digest, context)

        return Data(bytes: digest)
    

为方便起见,我们为Data做了一个扩展:

extension Data 
    func sha512() -> Data 
        let s = Sha512()
        s.update(data: self)
        return s.final()
    

最后是String的扩展:

extension String 
    func sha512() -> Data 
        return self.data(using: .utf8)!.sha512()
    

该解决方案可用于Sha256,MD5等,以获得Apple的CommonCrypto的真正通用解决方案。

另一答案

斯威夫特3

func sha512() -> String 
    let data = self.data(using: .utf8)!
    var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH))
    data.withUnsafeBytes(
        _ = CC_SHA512($0, CC_LONG(data.count), &digest)
    )

    return digest.map( String(format: "%02hhx", $0) ).joined(separator: "")

斯威夫特2.3

func sha512() -> String 
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
    var digest = [UInt8](count:Int(CC_SHA512_DIGEST_LENGTH), repeatedValue: 0)
    CC_SHA512(data.bytes, CC_LONG(data.length), &digest)
    let hexBytes = digest.map  String(format: "%02hhx", $0) 

    return hexBytes.joinWithSeparator("")

另一答案

您需要导入C库CommonCrypto。您不能只将CommonCrypto导入swift文件,因为它不是一个独立的模块。

如果你有一个桥接头文件,你很幸运!只需将其添加到该文件即可

#import <CommonCrypto/CommonCrypto.h>

There are some articles about different ways to do that.

然后你可以使用这段代码让sha512可用于你选择的任何字符串。

迅速5

extension String 

    public var sha512: String 
        let data = self.data(using: .utf8) ?? Data()
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH))
        data.withUnsafeBytes 
            _ = CC_SHA512($0.baseAddress, CC_LONG(data.count), &digest)
        
        return digest.map( String(format: "%02hhx", $0) ).joined(separator: "")
    

如何在 Java 中使用 SHA-512 对密码进行哈希处理?

...时间】:2016-01-1004:33:42【问题描述】:我一直在研究Java字符串加密技术,不幸的是我没有找到任何好的教程,如何在Java中使用SHA-512对字符串进行哈希处理;我阅读了一些关于MD5和Base64的博客,但它们并没有我想的那么安全(实... 查看详情

如何有效地比较两个 SHA512Managed 哈希值

...-06-2505:19:24【问题描述】:我使用SHA512Managed类对用户密码字符串进行编码。我最初按以下方式创建了标准具字符串:将密码字符串(例如“Johnson_#1”)转换为字节数组;使用SHA512Managed.ComputeHash获 查看详情

如何在 .NET 6 中正确计算 sha 512 哈希

】如何在.NET6中正确计算sha512哈希【英文标题】:Howtocalculatesha512hashproperlyin.NET6【发布时间】:2021-11-2510:34:59【问题描述】:在来自HowcanISHA512astringinC#?的.NET6代码中vardata=Encoding.UTF8.GetBytes("key");byte[]hash;using(SHA512shaM=newSHA512Managed( 查看详情

如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?

】如何使用OpenSSL计算SHA512/224和SHA512/256哈希?【英文标题】:HowtocalculateSHA512/224andSHA512/256hashesusingOpenSSL?【发布时间】:2018-06-0714:23:05【问题描述】:这是我在C中计算SHA512哈希的方法。#include<openssl/sha.h>#include<stdio.h>char*... 查看详情

如何使用 SecureString 创建 SHA1 或 SHA512 哈希?

】如何使用SecureString创建SHA1或SHA512哈希?【英文标题】:HowdoauseaSecureStringtocreateaSHA1orSHA512Hash?【发布时间】:2010-12-0412:13:12【问题描述】:我想在VB.NET中使用SecureString变量并将其转换为SHA1或SHA512哈希。如何安全地将SecureString转... 查看详情

使用 SHA512 的哈希字符串的长度是多少?

】使用SHA512的哈希字符串的长度是多少?【英文标题】:WhatisthelengthofahashedstringwithSHA512?【发布时间】:2013-08-1615:55:48【问题描述】:用sha512散列的字符串的长度总是一样吗?如果有,那是什么?【问题讨论】:crypto.stackexchange.c... 查看详情

我在哪里可以找到 Spring Boot 包的 SHA256/SHA512 哈希?

】我在哪里可以找到SpringBoot包的SHA256/SHA512哈希?【英文标题】:WherecanIfindSHA256/SHA512hashesforSpringBootpackages?【发布时间】:2021-05-2904:44:15【问题描述】:我正在尝试通过利用其dependencyverification功能来提高我的Gradle项目的安全性。... 查看详情

在 Perl 中创建 glibc 2.7 样式的 Sha-512 加密哈希

】在Perl中创建glibc2.7样式的Sha-512加密哈希【英文标题】:Creatingglibc2.7styleSha-512crypthashesinPerl【发布时间】:2012-06-1613:19:51【问题描述】:所以,我有一个网站,可以从数据库中读取/验证(和写入)密码哈希,并且我有一些东西... 查看详情

密码哈希:PBKDF2(使用 sha512 x 1000)与 Bcrypt

】密码哈希:PBKDF2(使用sha512x1000)与Bcrypt【英文标题】:PasswordHashing:PBKDF2(usingsha512x1000)vsBcrypt【发布时间】:2011-05-2421:50:09【问题描述】:我一直在阅读有关Gawker事件的文章,并且出现了几篇关于仅使用bcrypt来散列密码的文章... 查看详情

如何在带有 sha512 的 freeBSD 上使用 crypt()?

】如何在带有sha512的freeBSD上使用crypt()?【英文标题】:Howtousecrypt()onfreeBSDwithsha512?【发布时间】:2013-12-3112:14:22【问题描述】:目前我的代码如下所示:if(iInit==1)if(crypt_set_format("sha512")==0)return-1;iInit=!iInit;res=crypt(szPWhash,"ABCDEFGH");... 查看详情

使用 SHA512 对密码进行哈希处理以加密数据

】使用SHA512对密码进行哈希处理以加密数据【英文标题】:UseSHA512tohashapasswordtoencryptdata【发布时间】:2019-04-2108:04:19【问题描述】:我有一个C#应用程序,有时我必须在其中加密一些数据(XML文件)。基本上,问题是我不能在服... 查看详情

Swift 3:将 SHA256 哈希字符串转换为 SecCertificate

】Swift3:将SHA256哈希字符串转换为SecCertificate【英文标题】:Swift3:ConvertSHA256hashstringtoSecCertificate【发布时间】:2017-01-0900:35:15【问题描述】:Alamofire允许使用证书和公钥进行固定(尽管从包中获取公钥的函数从包中的证书中获取... 查看详情

SHA512 算法的哈希值是 128 位长吗?

】SHA512算法的哈希值是128位长吗?【英文标题】:HashvaluefromSHA512algorithmis128bitslong?【发布时间】:2013-02-2215:04:43【问题描述】:我有一个奇怪的问题。在我的代码中,我创建了一个sha512哈希算法并用它签署了一些数据。现在我希... 查看详情

如何在 Swift 中将字符串数组保存到 Core Data

】如何在Swift中将字符串数组保存到CoreData【英文标题】:HowtosaveStringArraytoCoreDatainSwift【发布时间】:2017-07-1309:50:13【问题描述】:我需要将我的字符串数组保存到CoreData。letstringArray:[String]=["FirstString","SecondString","ThirdString"]我有... 查看详情

python使用这一个函数在python中运行sha512哈希文本。为什么sha512?为什么在做这件事的整个过程中你会做得更少(代码片段)

查看详情

如何在 Android 中计算字符串的 SHA-256 哈希?

】如何在Android中计算字符串的SHA-256哈希?【英文标题】:HowcanIcalculatetheSHA-256hashofastringinAndroid?【发布时间】:2011-11-0205:27:46【问题描述】:我正在尝试在Android中获取字符串的SHA256。这是我要匹配的PHP代码:echobin2hex(mhash(MHASH_SH... 查看详情

网络安全——base64编码md5sha1-sha512hmac(sha1-sha512)哈希

阅读目录一、Base64编码二、MD5、SHA1、SHA256、SHA512、HMAC实现github代码下载地址据说今天520是个好日子,为什么我想起的是502、500、404这些?还好服务器没事!一、Base64编码Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(... 查看详情

C# - 是不是可以使用 RSA SHA512 对哈希进行签名?

】C#-是不是可以使用RSASHA512对哈希进行签名?【英文标题】:C#-IsitpossibletoSignhashusingRSASHA512?C#-是否可以使用RSASHA512对哈希进行签名?【发布时间】:2016-09-2520:00:39【问题描述】:我使用OpenSSL创建了一个自签名证书,如下所示:o... 查看详情