我必须用Node.JS编写一些代码来获取API文档,但是我在最近几天尝试了我在网上找到的所有解决方案(包括Stack当然)都没有成功...
我的API使用HTTP Digest Auth,这就是问题,我能够连接,这不是什么大问题,但每次我得到相同的回报:
Got response : 401
HTTP Digest Authentication required for "api.example.com"
Run Code Online (Sandbox Code Playgroud)
你可以在没有auth的情况下显示我的基本代码!因为我做了所有的尝试后我不知道自己能做什么:
var http = require('http')
var options = {
host: 'api.example.com',
path: '/example/1.xml',
};
var request = http.get(options, function(res){
var body = "";
res.on('data', function(data){
body += data;
})
res.on('end', function(){
console.log('Got response : ' + res.statusCode);
console.log(body);
})
res.on('error', function(e){
console.log('Got error : ' +e.message);
});
});
Run Code Online (Sandbox Code Playgroud)
我最后一次尝试是使用这个模块https://npmjs.org/package/request但是每次我得到401时他都不会工作!
有关更多信息,我能够使用Ruby,Python,php和Java连接并获取我需要的API信息,因此我确信我的API运行良好,并且我传递的信息是正确的.我使用Node v0.10.11的最后一个稳定版!
如果有人可以帮助我或找到解决方案,我会很高兴.
编辑:我将使用模块Mickael/request添加有关我的测试的一些细节
第一次尝试 :
var request = require('request')
var options = …
Run Code Online (Sandbox Code Playgroud) httprequest digest digest-authentication http-digest node.js
我需要将一些Ruby代码翻译成JavaScript并遇到以下函数:
def sha1_hex(h)
Digest::SHA1.hexdigest([h].pack('H*'))
end
Run Code Online (Sandbox Code Playgroud)
[h].pack('H*')
在这种情况下究竟意味着什么?它将如何转换为JavaScript?
angular的$http
服务正在触发$digest
每一个get
(如果没有$digest
已经运行):
if (!$rootScope.$$phase) $rootScope.$apply();
Run Code Online (Sandbox Code Playgroud)
除了从我们的API中获取对象之外,我们的应用程序还有许多指令templateUrl
- 通过角度使用获取$http
.这会导致数以百计的$digest
冷启动循环.
注释出上述线,减少的数量$digest
的循环至约3,和应用程序运行MUCH快,没有破碎的绑定(至少由于$http
不触发$digest
).
有没有办法禁用$ http触发$ digest?
我将解释到目前为止我所做的所有步骤,并以我的问题结束.
使用OpenSSL 1.0.1e-fips 2013年2月11日
生成私钥和公钥
openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)
使用摘要和私钥签名消息
openssl dgst -sha256 -sign private.pem -out message.secret message.txt
Run Code Online (Sandbox Code Playgroud)
在这一点上,我有一个公钥,一个签名的消息(带摘要)和原始消息.
第1部分 - 使用CLI(这个工作)
使用CLI我设法验证摘要:
openssl dgst -sha256 -verify public.pem -signature message.secret message.txt
Run Code Online (Sandbox Code Playgroud)
我将"已验证"作为返回值.
第2部分 - 使用C程序
我的程序看起来像这样:
哪里:
msg是message.txt
签名是message.secret
pkey是公钥(使用PEM_read_PUBKEY实现)
int verify_it(const byte* msg, size_t msg_len, byte* signature, EVP_PKEY* pkey) {
EVP_MD_CTX *ctx;
size_t sig_len;
int bool_ret;
int ret_val;
ret_val = EXIT_SUCCESS;
ctx = NULL;
do
{
ctx = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我正在使用的Common Lisp应用程序中散列一些字符串.sd-sha1包似乎不受支持,并且已经有一段时间由CLiki页面判断,这建议使用Ironclad.很公平,
=> (require 'ironclad)
NIL
Run Code Online (Sandbox Code Playgroud)
Ironclad虽然不做字符串摘要; 这是在其项目页面上声明的有意设计选择,我应该做的是将我的字符串转换为字节字符串并哈希.换一种说法
=> (ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206)
Run Code Online (Sandbox Code Playgroud)
好吧,现在的问题是,整个练习的要点是找出原始字符串输入的sha1-hashed字符串,这意味着我真的想将上面的字符串转换为字符串格式.但,
=> (flexi-streams:octets-to-string
(ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
:external-format :utf-8)
This sequence can't be decoded using UTF-8 as it is too short.
1 octet missing at then end.
[Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR]
Restarts:
0: [ABORT] Exit debugger, returning to top level.
Run Code Online (Sandbox Code Playgroud)
另一种选择是flexi-streams
推断正确的编码.
=> (flexi-streams:octets-to-string …
Run Code Online (Sandbox Code Playgroud) 我需要从一个可变长度的字符串中提取一个8字节的摘要,所以我正在寻找一个我将在c/c ++中实现的算法.这将是微控制器上数字签名程序的一部分,因此它必须是:
我看了一下现有的算法,比如crc64,但它们对我的平台来说似乎太重了.
我无法弄清楚我在这里做错了什么.我有以下代码:
byte[] digest = new byte[0];
MessageDigest md = null;
try{
md = MessageDigest.getInstance( "SHA-512" );
}
catch( NoSuchAlgorithmException e ) {
return digest;
}
digest = md.digest( myString.getBytes() );
Run Code Online (Sandbox Code Playgroud)
查看NetBeans调试器中摘要byte []的十六进制值,它显示的内容与输出的不同:
echo "myString" | openssl dgst -sha512
Run Code Online (Sandbox Code Playgroud)
我猜这是一个字符编码问题,但是JVM和openssl是否使用了该机器的默认字符集?
任何帮助表示赞赏.
我阅读了有关摘要认证的所有帖子,我正在尝试,但我有任何问题,我有一个实施摘要认证的restlet,并与javascript api我正在尝试进行身份验证.
首先,我对服务器执行xmlhttprequest POST(从file://到localhost:8111,因此我遇到了CORS问题但是已经解决了),以及服务器响应401和WWW-Authenticate标头:
WWW-Authenticate:Digest realm="Guard", domain="/", nonce="MTMzOTA5Mjk1NTE2NDo0NzY2NjJiOTgyMjE1ZDc0OWU3NzM5MTkzMWNjNGQzNw==", algorithm=MD5, qop="auth"
Run Code Online (Sandbox Code Playgroud)
所以我采用这个标题并应用身份验证摘要算法:首先创建2个变量,"cnonce"和"nc":
tokensObj["cnonce"] = 'bd5fd9b093dccaa1'; (invented)
tokensObj["nc"] = '00000001';
Run Code Online (Sandbox Code Playgroud)
我在我的文字对象中创建'uri'参数(在服务器响应中有一个"域":?)我取'domain'的值并放入我的对象的'uri'键.
之后,我做了算法:
var HA1 = MD5("login:Guard:mypassword");
var HA2 = MD5("POST:/");
var authResponse = MD5(HA1 + ':' +
unquotes(tokensObj["nonce"]) +
':' +
tokensObj["nc"] +
':' +
tokensObj["cnonce"] +
':' +
unquotes(tokensObj["qop"]) +
':' +
HA2);
var responseContentHeader = 'Digest username:"login"' +', realm=' + tokensObj["realm"] +
', nonce=' + tokensObj["nonce"] +
', uri=' + tokensObj["domain"] +
', algorithm=' + tokensObj["algorithm"] +
', response="' + …
Run Code Online (Sandbox Code Playgroud) 我一直在这里关注Docker教程,并通过对现有图像进行更改并使用三个不同标签对其进行标记,在我的本地OSX计算机上构建测试图像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
adamatan/sinatra devel fccb6b4d21b4 8 minutes ago 469.5 MB
adamatan/sinatra junk fccb6b4d21b4 8 minutes ago 469.5 MB
adamatan/sinatra latest fccb6b4d21b4 8 minutes ago 469.5 MB
Run Code Online (Sandbox Code Playgroud)
但是,这些图像都没有摘要:
# docker images --digests adamatan/sinatra
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
adamatan/sinatra devel <none> fccb6b4d21b4 9 minutes ago 469.5 MB
adamatan/sinatra junk <none> fccb6b4d21b4 9 minutes ago 469.5 MB
adamatan/sinatra latest <none> fccb6b4d21b4 9 minutes ago 469.5 MB
Run Code Online (Sandbox Code Playgroud)
我用Dockerfile创建的其他测试图像确实有摘要.
为什么有些图片有摘要而有些没有?它与图像的创建方式有关(Dockerfile与否)?
我正在创建一个自动递增数字的哈希值.我已经创建了两个示例循环,我正在尝试实现此目的.
运行#1时,第一个哈希记录到控制台,第二次迭代通过循环,返回以下错误.错误:已经调用摘要
我相信这是由于文档中的这个引用:在调用hash.digest()方法之后,不能再使用Hash对象.多次调用将导致抛出错误.
如何创建一个使用Node的加密库一次创建多个哈希的循环?
// Reproduce #1
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
for (let i = 0; i < 5; i++) {
hash.update('secret' + i);
console.log(hash.digest('hex'));
}
Run Code Online (Sandbox Code Playgroud) digest ×10
javascript ×3
c ×2
node.js ×2
openssl ×2
angularjs ×1
c++ ×1
common-lisp ×1
cryptography ×1
docker ×1
hash ×1
hex ×1
http ×1
http-digest ×1
httprequest ×1
ironclad ×1
java ×1
message ×1
ruby ×1
sha ×1
sha256 ×1