我的 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/
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby
假设您在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
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上
我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建