如何在 Dart 上生成摘要密码以与网络摄像机通信
How to generate Digest password on Dart for communicate with ip camera
我正在尝试与支持 Onvif 协议的网络摄像机进行通信,并且
我需要生成一个摘要密码。
这是 similar topic,但没有帮助。
这是关于这件事的 oasis-open standart。
如果我理解正确,我应该使用这个公式
Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
我试过这样的事情:
import 'package:crypto/crypto.dart';
var username = "admin";
var mNonce = base64Encode(utf8.encode("12345678901234567890"));
Digest digest = sha1.convert(utf8.encode(mNonce + -12-25T07:55:35Z' + '21063598'));
var mPasswordDigest = base64Encode(digest.bytes);
但是网络摄像机响应:400 "not Authorized"
我使用了 http 嗅探器并检查发送的应用程序(Android 上的 Onvifer),
我发送了相同的复制请求,它给出了 ok 状态代码 200。
所以问题是 digestPassword 的生成方式不正确。
这是工作请求的正文:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" '
'xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope">'
'<v:Header><Action mustUnderstand="1" xmlns="http://www.w3.org/2005/08/addressing">http://www.onvif.org/ver10/media/wsdl/GetSnapshotUri</Action>'
'<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>admin</Username>'
'<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">'
''x8IytKlr8cTH+sT9EzEaVDLqYGw='</Password>'
'<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">'
''Njg2YzYxZDI4YjA4ZDA0Nw=='</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'
''2019-12-25T07:55:35Z'</Created></UsernameToken></Security></v:Header><v:Body><GetSnapshotUri xmlns="http://www.onvif.org/ver10/media/wsdl">'
'<ProfileToken>PROFILE_000</ProfileToken></GetSnapshotUri></v:Body></v:Envelope>';
我们需要使用这个公式生成
摘要 = B64ENCODE( SHA1( Nonce + 日期 + 密码 ))
import 'package:crypto/crypto.dart';
var username = "admin";
var mNonce = base64Encode(utf8.encode("12345678901234567890"));
Digest digest = sha1.convert(utf8.encode("12345678901234567890"+ -12-25T07:55:35Z' + '21063598'));
var mPasswordDigest = base64Encode(digest.bytes);
我正在尝试与支持 Onvif 协议的网络摄像机进行通信,并且 我需要生成一个摘要密码。 这是 similar topic,但没有帮助。 这是关于这件事的 oasis-open standart。 如果我理解正确,我应该使用这个公式
Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
我试过这样的事情:
import 'package:crypto/crypto.dart';
var username = "admin";
var mNonce = base64Encode(utf8.encode("12345678901234567890"));
Digest digest = sha1.convert(utf8.encode(mNonce + -12-25T07:55:35Z' + '21063598'));
var mPasswordDigest = base64Encode(digest.bytes);
但是网络摄像机响应:400 "not Authorized"
我使用了 http 嗅探器并检查发送的应用程序(Android 上的 Onvifer), 我发送了相同的复制请求,它给出了 ok 状态代码 200。 所以问题是 digestPassword 的生成方式不正确。
这是工作请求的正文:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" '
'xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope">'
'<v:Header><Action mustUnderstand="1" xmlns="http://www.w3.org/2005/08/addressing">http://www.onvif.org/ver10/media/wsdl/GetSnapshotUri</Action>'
'<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>admin</Username>'
'<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">'
''x8IytKlr8cTH+sT9EzEaVDLqYGw='</Password>'
'<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">'
''Njg2YzYxZDI4YjA4ZDA0Nw=='</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'
''2019-12-25T07:55:35Z'</Created></UsernameToken></Security></v:Header><v:Body><GetSnapshotUri xmlns="http://www.onvif.org/ver10/media/wsdl">'
'<ProfileToken>PROFILE_000</ProfileToken></GetSnapshotUri></v:Body></v:Envelope>';
我们需要使用这个公式生成
摘要 = B64ENCODE( SHA1( Nonce + 日期 + 密码 ))
import 'package:crypto/crypto.dart';
var username = "admin";
var mNonce = base64Encode(utf8.encode("12345678901234567890"));
Digest digest = sha1.convert(utf8.encode("12345678901234567890"+ -12-25T07:55:35Z' + '21063598'));
var mPasswordDigest = base64Encode(digest.bytes);