草庐IT

ios - phpass 在 swift 中散列类似的功能

coder 2023-09-17 原文

我的 wordpress 后端使用 phpass 哈希算法并使用网络服务给我 phpass。在 ios 中以 swift 结束我试图在 swift 中生成相同的 phpass 哈希。以下是 swift 和 php 中的代码。两者都有相同的输入但输出不同。所以问题是我怎样才能得到相同的输出。我错过了什么吗?

PHP 代码:

<?php
function phpassHash($password, $salt,$iterations){
    $hash = hash('md5', $salt.$password, TRUE);
    for($i = 0; $i < $iterations; $i++){
        $hash = hash('md5', $hash.$password, TRUE);
    }
    return $hash;
}
$result = phpassHash("a_test_password","MsdvACyA", 8192);
echo bin2hex($result); 
?>

快速代码:

func md5(string: String) -> String {
        var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
        if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
            CC_MD5(data.bytes, CC_LONG(data.length), &digest)
        }
        var digestHex = ""
        for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
            digestHex += String(format: "%02x", digest[index])
        }

        return digestHex
    }



func phpassHash(password: String, salt: String, iterations: Int) -> String {
        var hash = md5(salt+password)
        for _ in 0..<iterations {
            hash = md5(hash+password)
        }
        return hash;
    }

最佳答案

您太急于在 md5 函数中将字节数组转换为 String。例如,这会将整数 0x47 的含义更改为字符串 47。您对 md5() 的第一次调用返回了正确的散列,但是如果您再次调用 md5() ,它将出错,因为它现在是一个字符串而不是字节数组就像在 PHP 中一样。请注意,在 PHP 中,您会在最后一步调用 bin2hex

由于 CommonCrypt 中的 CC_MD5 函数喜欢处理字节数组,所以如果需要,将所有内容都保留为字节和 writer wrapper。

首先,让我们定义一些辅助函数:

extension String {
    // Return the bytes that make up the string according to UTF-8 encoding
    var bytes: [UInt8] {
        get {
            return self.cStringUsingEncoding(NSUTF8StringEncoding)!
                .dropLast() // C strings are null-terminated so we need to drop the last byte
                .map { UInt8(bitPattern: $0) }
        }
    }
}

// Convert an array of bytes to a hex string
func toHexString(bytes: [UInt8]) -> String {
    return bytes.map { String(format: "%02x", $0) }.joinWithSeparator("")
}

现在您可以编写哈希函数了:

// Allow you to quickly hash a string. We don't really use it here
func md5(string: String) -> [UInt8] {
    return md5(string.bytes)
}

func md5(bytes: [UInt8]) -> [UInt8] {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)

    CC_MD5(bytes, CC_LONG(bytes.count), &digest)
    return digest
}

func phpassHash(password: String, salt: String, iterations: Int) -> [UInt8] {
    let passwordBytes = password.bytes
    let saltBytes     = salt.bytes

    var hash = md5(saltBytes + passwordBytes)
    for _ in 0..<iterations {
        hash = md5(hash + passwordBytes)
    }

    return hash
}

let password   = "a_test_password"
let salt       = "MsdvACyA"
let iterations = 8192
let assHash    = phpassHash(password, salt: salt, iterations: iterations)

print(toHexString(assHash)) // 42a89278a28860f223a10fdb43b5d4b2

关于ios - phpass 在 swift 中散列类似的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049791/

有关ios - phpass 在 swift 中散列类似的功能的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - Ruby 是否有类似于 Perl 的 "perl -d"的逐步调试器? - 2

    Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby​​2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby​​-debug的后继者 关于ruby-Ruby

  6. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. 语法类似于 GitHub Flavored Markdown 的 Ruby markdown 解释器? - 2

    我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong

  9. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  10. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

随机推荐