- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道如何计算X509证书的公钥密码?
例如。我通过网络请求获得了证书
var cert = (httpRequest as HttpWebRequest).ServicePoint.Certificate;
X509Certificate2 cert2 = new X509Certificate2(cert);
我不确定此后要做什么,因为我需要主题公钥信息(对其进行哈希处理)但我无法在 X509Certificate2 类中找到它或不确定如何构造它。我可以通过 GetKeyInfo() 方法获取指数和模数,这似乎是 SPKI 的核心。
我确信有一种简单的方法可以做到这一点,但任何帮助都会很棒!
谢谢
最佳答案
辅助方法:
String publicKeyPinningHash = certificate.GetPublicKeyPinningHash();
String s = String.Format("Public-Key-Pins: pin-sha256=\"{0}\";
max-age=31536000", publicKeyHash);
Facebook.com 吐出的内容:
Public-Key-Pins: pin-sha256="hUIG87ch71EZQYhZBEkq2VKBLjhussUw7nR8wyuY7rY="; max-age=31536000
https://dotnetfiddle.net/F9t6IQ
如您所见,.NET Framework 无法操作 X509Certificate .
X.509 证书使用 ASN.1 的 DER 风格进行编码。 .NET Framework 无法操纵 AsnEcodedData .
这意味着我们需要滚动自己的代码来计算 X.509 证书的 PublicKeyPinning 哈希:
static String GetPublicKeyPinningHash(X509Certificate2 x509Cert)
{
//Public Domain: No attribution required
//Get the SubjectPublicKeyInfo member of the certificate
Byte[] subjectPublicKeyInfo = GetSubjectPublicKeyInfoRaw(x509Cert);
//Take the SHA2-256 hash of the DER ASN.1 encoded value
Byte[] digest;
using (var sha2 = new SHA256Managed())
{
digest = sha2.ComputeHash(subjectPublicKeyInfo);
}
//Convert hash to base64
String hash = Convert.ToBase64String(digest);
return hash;
}
这段代码建立在 .NET 也没有提供的底层函数之上,以获取原始的 SubjectPublickeyInfo 字节:
static Byte[] GetSubjectPublicKeyInfoRaw(X509Certificate2 x509Cert)
{
//Public Domain: No attribution required
Byte[] rawCert = x509Cert.GetRawCertData();
/*
Certificate is, by definition:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version MUST be v3
}
So we walk to ASN.1 DER tree in order to drill down to the SubjectPublicKeyInfo item
*/
Byte[] list = AsnNext(ref rawCert, true); //unwrap certificate sequence
Byte[] tbsCertificate = AsnNext(ref list, false); //get next item; which is tbsCertificate
list = AsnNext(ref tbsCertificate, true); //unwap tbsCertificate sequence
Byte[] version = AsnNext(ref list, false); //tbsCertificate.Version
Byte[] serialNumber = AsnNext(ref list, false); //tbsCertificate.SerialNumber
Byte[] signature = AsnNext(ref list, false); //tbsCertificate.Signature
Byte[] issuer = AsnNext(ref list, false); //tbsCertificate.Issuer
Byte[] validity = AsnNext(ref list, false); //tbsCertificate.Validity
Byte[] subject = AsnNext(ref list, false); //tbsCertificate.Subject
Byte[] subjectPublicKeyInfo = AsnNext(ref list, false); //tbsCertificate.SubjectPublicKeyInfo
return subjectPublicKeyInfo;
}
它建立在较低级别的函数之上,用于解析使用 ASN.1 的 DER 风格编码的 ASN.1 编码数据:
static Byte[] AsnNext(ref Byte[] buffer, Boolean unwrap)
{
//Public Domain: No attribution required
Byte[] result;
if (buffer.Length < 2)
{
result = buffer;
buffer = new Byte[0];
return result;
}
int index = 0;
Byte entityType = buffer[index];
index += 1;
int length = buffer[index];
index += 1;
int lengthBytes = 1;
if (length >= 0x80)
{
lengthBytes = length & 0x0F; //low nibble is number of length bytes to follow
length = 0;
for (int i = 0; i < lengthBytes; i++)
{
length = (length << 8) + (int)buffer[2 + i];
index += 1;
}
lengthBytes++;
}
int copyStart;
int copyLength;
if (unwrap)
{
copyStart = 1 + lengthBytes;
copyLength = length;
}
else
{
copyStart = 0;
copyLength = 1 + lengthBytes + length;
}
result = new Byte[copyLength];
Array.Copy(buffer, copyStart, result, 0, copyLength);
Byte[] remaining = new Byte[buffer.Length - (copyStart+copyLength)];
if (remaining.Length > 0)
Array.Copy(buffer, copyStart + copyLength, remaining, 0, remaining.Length);
buffer = remaining;
return result;
}
关于c# - 计算公钥密码 (.Net),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39441425/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!