我正在尝试为Amazon S3 Web服务构建一个可用的加密签名,使用Objective C编写连接库.
我已经遇到了使用ObjC代码的HMAC SHA-1摘要问题,因此我将其放在一边,查看现有的,正在运行的Perl代码,以尝试解决摘要创建问题.
我正在测试包的s3ls
命令中的HMAC SHA-1摘要输出Net::Amazon::S3
,并将其与_encode
我提取并放入其自己的perl脚本的子例程进行比较:
#!/usr/bin/perl -w
use MIME::Base64 qw(encode_base64);
use Digest::HMAC_SHA1;
use String::Escape qw( printable unprintable );
sub _ascii_to_hex {
(my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
return $str;
}
sub _encode {
my ( $aws_secret_access_key, $str ) = @_;
print "secret key hex: "._ascii_to_hex($aws_secret_access_key)."\n";
my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key);
$hmac->add($str);
my $digest = $hmac->digest;
print "cleartext hex: "._ascii_to_hex($str)."\n";
print "digest hex: "._ascii_to_hex($digest)."\n";
my $b64 = encode_base64( $digest, '' ); …
Run Code Online (Sandbox Code Playgroud) 有谁知道如何筛选使用摘要http身份验证的网站?我使用这样的代码:
var request = (HttpWebRequest)WebRequest.Create(SiteUrl);
request.Credentials=new NetworkCredential(Login, Password)
Run Code Online (Sandbox Code Playgroud)
我可以访问该网站的主页,但当我尝试浏览任何其他页面(使用具有相同凭据的另一个请求)时,我收到"HTTP/1.1 400错误请求"错误.
我使用Fiddler将我的C#应用程序的请求与Mozilla Firefox请求进行比较.
我尝试访问的2个网址是: https://mysiteurl/forum/index.php https://mysiteurl/forum/viewforum.php?f = 4&sid = d104363e563968b4e4c07e04f4a15203
这是我的C#应用程序的2个请求():
Authorization: Digest username="xxx",realm="abc",nonce="NXa26+NjBAA=747dfd1776c9d585bd388377ef3160f1ff265429",uri="/forum/index.php",algorithm="MD5",cnonce="89179bf17dd27785aa1c88ad976817c9",nc=00000001,qop="auth",response="3088821620d9cbbf71e775fddbacfb6d"
Authorization: Digest username="xxx",realm="abc",nonce="1h7T6+NjBAA=4fed4d804d0edcb54bf4c2f912246330d96afa76",uri="/forum/viewforum.php",algorithm="MD5",cnonce="bb990b0516a371549401c0289fbacc7c",nc=00000001,qop="auth",response="1ddb95a45fd7ea8dbefd37a2db705e3a"
Run Code Online (Sandbox Code Playgroud)
这就是Firefox发送到服务器的内容:
Authorization: Digest username="xxx", realm="abc", nonce="T9ICNeRjBAA=4fbb28d42db044e182116ac27176e81d067a313c", uri="/forum/", algorithm=MD5, response="33f29dcc5d70b61be18eaddfca9bd601", qop=auth, nc=00000001, cnonce="ab96bbe39d8d776d"
Authorization: Digest username="xxx", realm="abc", nonce="T9ICNeRjBAA=4fbb28d42db044e182116ac27176e81d067a313c", uri="/forum/viewforum.php?f=4&sid=d104363e563968b4e4c07e04f4a15203", algorithm=MD5, response="a996dae9368a79d49f2f29ea7a327cd5", qop=auth, nc=00000002, cnonce="e233ae90908860e1"
Run Code Online (Sandbox Code Playgroud)
所以在我的应用程序中,我在"nonce"字段中有不同的值,而在Firefox中,这个字段是相同的.另一方面,我在"nc"字段中具有相同的值,而Firefox增加此字段.
此外,当我的应用程序尝试访问Fiddler中的网站页面时,我可以看到它始终获得响应"HTTP/1.1 401 Authorization Required",而Firefox只授权一次.我试过设置request.PreAuthenticate = true; 但似乎没有效果......
我的问题是:如何使用C#正确实现摘要认证?有没有标准方法或我必须从头开始做?提前致谢.
我使用JAXRSClientFactory.create方法创建这样的代理:
IMyService myService
= JAXRSClientFactory.create("http://myserviceurl/", IMyService.class, "login1", "pwd", null);
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.
之后,我需要使用此服务与另一个凭据,我尝试使用另一个凭据创建相同的服务,如下所示:
IMyService myNewService
= JAXRSClientFactory.create("http://myserviceurl/", IMyService.class, "login2", "pwd", null);
Run Code Online (Sandbox Code Playgroud)
此代码有效,但使用错误的凭据(使用第一个服务的凭据).我没有找到任何方法来改变它(重置,或清除,或类似的东西).
还有一个细节,这个问题只有摘要授权.基本的,它运作良好.
任何人都可以帮我解决这个问题.
谢谢.
perl Digest
模块计算不同的SHA1摘要add
和addfile
函数.我使用了创建二进制随机数据/dev/urandom
在ubuntu上运行
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.1 LTS
Release: 12.04
Codename: precise
$ perl -v
This is perl 5, version 14, subversion 2 (v5.14.2) built for i686-linux-gnu-thread-multi-64int
Run Code Online (Sandbox Code Playgroud)
脚本输出
$ perl t.pl sha1 a.tmp
doesntwork da39a3ee5e6b4b0d3255bfef95601890afd80709
works ee49451434cffe001a568090c86f16f076677af5
$ openssl dgst -sha1 a.tmp
SHA1(a.tmp)= ee49451434cffe001a568090c86f16f076677af5
Run Code Online (Sandbox Code Playgroud)
在我的代码中跟随
use strict;
use warnings;
use Switch;
use Digest;
sub doesntwork {
my ($datafile, $hashfun) = @_;
open(my $fh, "<", …
Run Code Online (Sandbox Code Playgroud) 我试图按照"如何使用此库的基本身份验证?"这一问题的示例进行操作.
这是我的getHeaders()
功能
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> params = new HashMap<String, String>();
String creds = String.format("%s:%s","MyEmail","MyPassword");
String auth = "Digest " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
params.put("Authorization", auth);
params.put("MY-API-TOKEN", "99999999999999999999999999999999999999999999999999");
return params;
}
Run Code Online (Sandbox Code Playgroud)
但我一直得到错误401
我正在使用Philsturgeon的Codeigniter RestServer作为我的RestApi
我知道:
Basic和Digest只是在Basic中放置一个看起来像这样的"Authorization:Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ =="的标题,并且更加复杂的摘要
但我似乎无法做到这一点.那么,如何使用Android-Volley进行摘要式身份验证?
我有一个关于计算用于数字签名的PDF文档摘要的快速问题(与我之前的一个问题有点相关,我试图弄清楚为什么你需要知道客户的证书才能创建正确的摘要).在Adobe有关PDF格式的文档中,指定了以下内容:
应在文件中的字节范围内计算字节范围摘要,该字节范围摘要应由签名字典中的ByteRange条目指示.此范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目).
所以在这一点上事情似乎相当简单,只是消化/ Sig字典中除/ Contents条目之外的所有内容./ Contents条目中的实际数据指定如下:
对于公钥签名,Contents应该是DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象.
所以仍然没有问题,我可以(可能)生成摘要,为/ Contents条目保留空间并稍后附加此PKCS#7对象.当我阅读以下内容时,混乱就开始了:
撤销信息是签名属性,这意味着签名软件必须在签名之前捕获吊销信息.类似的要求适用于证书链.签名软件必须在签名之前捕获并验证证书链.
所以我没有得到的东西:显然/ Contents条目(包含证书和签名摘要)没有消化,但证书链是一个签名属性(因此需要被消化?).
如果有人能够进一步确定消化的内容,我会很感激,也许更好地向我解释已签名的属性.我想回答的主要问题是:我是否可以在事先不知道某人的证书的情况下创建一个可签名的摘要?(我正在使用pkcs7分离签名)
我独立学习C++,我有一个问题,我不能解决超过一周的问题.我希望你能帮助我.
我需要获取Unicode字符串的SHA1摘要(如??????
),但我不知道如何做到这一点.
我尝试这样做,但它返回错误的摘要!
因为wstring('?')
它返回 - A469A61DF29A7568A6CC63318EA8741FA1CF2A7
我需要 -8dbe718ab1e0c4d75f7ab50fc9a53ec4f0528373
关心并抱歉我的英语:).
CryptoPP 5.6.2 MVC++ 2013
#include <iostream>
#include "cryptopp562\cryptlib.h"
#include "cryptopp562\sha.h"
#include "cryptopp562\hex.h"
int main() {
std::wstring string(L"?");
int bs_size = (int)string.length() * sizeof(wchar_t);
byte* bytes_string = new byte[bs_size];
int n = 0; //real bytes count
for (int i = 0; i < string.length(); i++) {
wchar_t wcharacter = string[i];
int high_byte = wcharacter & 0xFF00;
high_byte = high_byte >> 8;
int low_byte = wcharacter & 0xFF; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用使用密码摘要模式的 Web 服务,并且我的 Java 应用程序中具有这些函数来生成随机数、创建日期和密码摘要。我无法克服身份验证失败错误,并且文档对于他们是否需要 SHA-1 还是 MD5 并不太清楚,因为它顺便提到了两者。我尝试使用 MD5 而不是 SHA-1,得到了相同的结果。我设法通过 SoapUI 上的测试让请求正常工作,但我不知道该应用程序如何生成摘要/随机数。任何帮助表示赞赏。
这是我用来生成随机数和密码摘要的代码:
private static SOAPMessage createSOAPRequest() throws Exception
{
String password = "FakePassword";
String nonce = generateNonce();
System.out.println("Nonce = " + nonce);
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date today = Calendar.getInstance().getTime();
String created = dateFormatter.format(today);
System.out.println("Created = " + created);
String passwordDigest = buildPasswordDigest(nonce, created, password);
System.out.println("Password Digest = " + passwordDigest);
}
private static String buildPasswordDigest(String nonce, String created, String password) throws NoSuchAlgorithmException, UnsupportedEncodingException
{ …
Run Code Online (Sandbox Code Playgroud) 当我std.algorithm.copy
在std.digest
对象上使用时,与put
逐字节使用时相比,我获得了不同的结果.为什么?
import std.stdio;
import std.digest.digest;
import std.digest.md;
import std.algorithm;
void main() {
string s = "Hello!\n";
auto d1 = makeDigest!MD5;
auto d2 = makeDigest!MD5;
foreach (ubyte b; s) {
d1.put(b);
}
s.copy(d2);
writeln(digest!MD5(s).toHexString);
writeln(d1.finish().toHexString);
writeln(d2.finish().toHexString);
}
Run Code Online (Sandbox Code Playgroud)
输出:
E134CED312B3511D88943D57CCD70C83
E134CED312B3511D88943D57CCD70C83
D41D8CD98F00B204E9800998ECF8427E
Run Code Online (Sandbox Code Playgroud) 我尝试构建的服务器没有md4
/md5
可用(无法更改此)。有没有办法强制 Webpack 和所有插件使用特定的摘要方法?在我的webpack.[env].config
我有:
...
output: {
hashFunction: "RSA-SHA1"
}
...
Run Code Online (Sandbox Code Playgroud)
我可以在本地使用此更改构建项目,并且可以crypto.createHash('RSA-SHA1')
在远程服务器上运行,但尝试在远程服务器上使用更新的配置运行 Webpack 仍然会导致crypto.js
出现错误:
Error: Digest method not supported
Run Code Online (Sandbox Code Playgroud)
我使用的所有插件都来自hashfunction
from output
,所以这似乎不是问题。非常感谢任何有关如何解决此问题的想法。