如何在iphone/objective c中创建一个字符串的SHA256 ...
我读过这个..但我无法理解这一点..
我想创建类似于php函数的输出,如下所示: -
$hash = hash_hmac("sha256", implode(';', $hash_parameters), $api_key);
Run Code Online (Sandbox Code Playgroud)
其中哈希参数是参数数组...
你能把它写成一个取输入字符串的方法......?
什么是NSData或NSString方法的输出.. ??
我必须用这个创建一个请求.. ??
所以在请求对象中..
[theRequest setHTTPBody:requestBody];
Run Code Online (Sandbox Code Playgroud)
什么应该是requestBody的类型?
我正在运行一个在应用程序的两侧使用SHA-256的服务 - 一个是服务器端PHP实现,另一个是客户端iOS实现.在两侧使用算法的结果是相同的字母数字字符串,除了所有字母在iOS上大写并且在PHP上小写的情况.它们是相同的字母数字字符串这一事实使我相信SHA-256不区分大小写,但我找不到支持我的假设的任何文档.有人可以给我一些文件来证实吗?
所以我需要在Objective-C中生成一个Sha256密码,并且无法弄清楚我的生活怎么做!有什么容易的东西,我只是缺少?
我已经尝试实现以下方法(这是为iPhone编写的,但我想也许它可以跨平台工作,就像一些Objective-C代码那样)
-(NSString*)sha256HashFor:(NSString*)input
{
const char* str = [input UTF8String];
unsigned char result[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
{
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
但这只是吐出有关CC_SHA256_DIGEST_LENGTH是未声明标识符的错误.
我正在尝试在Elixir中编写Amazon Product Advertising API客户端.开发人员指南描述了签署API请求的过程,其中必须使用请求和"秘密访问密钥"创建HMAC-SHA26哈希.这是我写的用来处理签名请求的函数:
defp sign_request(url) do
url_parts = URI.parse(url)
request = "GET\n" <> url_parts.host <> "\n" <> url_parts.path <> "\n" <> url_parts.query
url <> "&Signature=" <> :crypto.hmac(:sha256, 'ThisIsMySecretAccessKey', request)
end
Run Code Online (Sandbox Code Playgroud)
传递给函数的url看起来像这样: http://webservice.amazon.com/onca/xml?AssociateTag=ThisIsMyAssociateTag&AWSAccessKeyId=ThisIsMyAWSAccessKeyId&Keywords=stuff&Operation=ItemSearch&SearchIndex=Apparel&Service=AWSECommerceService&Timestamp=2014-11-22T12%3A00%3A00Z&Validate=True&Version=2013-08-01
我遇到的问题是,虽然:crypto.hmac/3返回二进制文件,但该二进制文件不是字符串; 通过返回值String.valid?/1回报false.因此,我无法将返回值连接到url字符串的末尾以对请求进行签名.
我使用:crypto.hmac/3不正确吗?有什么我想念的吗?我还有另一种方法吗?
我在glassfish v3.0.1 b22中使用jdbcRealm来保证安全性.它被设置为使用我的数据库中的USER表进行身份验证,方法是访问以下博客:http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication.如果我将摘要算法保留为纯文本,我的工作正常.但是,当我尝试使用SHA-256进行摘要算法时,它会停止工作.我所做的是在Glassfish中指定 - 安全 - 领域 - jdbcRealm - 我想要SHA-256的摘要(我只是在摘要字段中键入SHA-256).然后我写了一个简单的Java程序,将密码文本转换为SHA-256哈希.然后我将该哈希粘贴到数据库中的密码字段中.顺便说一句,密码字段是类型varchar(30).我不能再登录了.有一点我注意到我的简单Java程序每次为同一文本字段生成不同的哈希值.
下面是我简单的java程序:
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "admin";
md.update(text.getBytes("UTF-8"));
byte[] digest = md.digest();
System.out.println(digest.toString());
Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下php代码移植到node.js上的javascript:
$mac = hash_hmac('SHA256', 'string', 'secret', true);
$coded = base64_encode($mac);
我尝试过以下方法:
var Crypto = require('crypto');
var code = Crypto.util.bytesToBase64(Crypto.HMAC(Crypto.SHA256, 'string', 'secret', { asBytes: true }));
我收到错误:
TypeError:Object #Object没有方法'HMAC'
我是node.js的新手,我做错了什么?
更新:
var code = Crypto.createHmac('SHA256',secret_key).update(to_encode).digest('base64');
我需要对电子邮件地址进行SHA256哈希处理,我需要将结果作为字符串.
我尝试了以下方法:
use Digest::SHA qw(sha256);
my $data = 'swaranga@gmail.com';
my $digest = sha256($data);
print $digest;
Run Code Online (Sandbox Code Playgroud)
但它打印的内容如下:
B/D6i1μû^Þ©Q;¢Þ
Run Code Online (Sandbox Code Playgroud)
我需要输出如下:
cbc41284e23c8c7ed98f589b6d6ebfd6
Run Code Online (Sandbox Code Playgroud)
上面的哈希是使用Apache DigestUtils的 SHA256生成器生成的.
我究竟做错了什么?我是perl的新手,所以如果它是愚蠢的借口.
谢谢.
我需要Windows的实用程序来计算sha256文件校验和,这样当我下载fedora时,我可以从这里验证校验和:https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUM
http://support.microsoft.com/kb/889768上的Microsoft实用程序仅执行md5和sha1.
我不想使用其他可下载的工具,这些工具没有签名,也没有从https或我不了解的来源获得,因为通过未加密的连接下载未签名的代码或从不受信任的源下载验证没有任何意义信任它的另一个代码的签名.
幸运的是谷歌提供了使用https进行所有下载的可能性,因此我可以通过安全连接下载Go并从那里开始.
这是一个简单的代码,可以为一个小文件执行此操作,但它对大文件不是很好,因为它不是流式传输.
package main
import (
"io/ioutil"
"crypto/sha256"
"os"
"log"
"encoding/hex"
)
func main() {
hasher := sha256.New()
s, err := ioutil.ReadFile(os.Args[1])
hasher.Write(s)
if err != nil {
log.Fatal(err)
}
os.Stdout.WriteString(hex.EncodeToString(hasher.Sum(nil)))
}
Run Code Online (Sandbox Code Playgroud)
如何使它使用流,以便它适用于任何文件大小.
如果我从Mac调用命令
echo hello | shasum -a 256
Run Code Online (Sandbox Code Playgroud)
或者来自ubuntu
echo hello | sha256sum
Run Code Online (Sandbox Code Playgroud)
然后我得到以下结果
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 -
Run Code Online (Sandbox Code Playgroud)
我注意到最后有冲刺.
但是当我使用Python hashlib或Java时java.security.MessageDigest,它们会给我相同的结果如下:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
Run Code Online (Sandbox Code Playgroud)
所以,有人能指出我错在哪里吗?
谢谢.
蟒蛇:
>>> import hashlib
>>> hashlib.sha256("hello").hexdigest()
Run Code Online (Sandbox Code Playgroud)
Java的:
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "hello";
md.update(text.getBytes("UTF-8"));
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < digest.length; i++) {
sb.append(String.format("%02x", digest[i] & 0xFF))
}
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenSSL/libcrypto编写一个C函数来计算文件的SHA256总和.我在我的基础上亚当拉默的C++示例代码在这里.
这是我的代码:
int main (int argc, char** argv)
{
char calc_hash[65];
calc_sha256("file.txt", calc_hash);
}
int calc_sha256 (char* path, char output[65])
{
FILE* file = fopen(path, "rb");
if(!file) return -1;
char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int bufSize = 32768;
char* buffer = malloc(bufSize);
int bytesRead = 0;
if(!buffer) return -1;
while((bytesRead = fread(buffer, 1, bufSize, file)))
{
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
sha256_hash_string(hash, output);
fclose(file);
free(buffer);
return 0;
}
void sha256_hash_string (char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
{
int …Run Code Online (Sandbox Code Playgroud)