我會PFXVerifyPassword和PFXIsPFXBlob本地函數去。雖然它需要一個p/invoke,但它是一個真正的交易。
C#簽名和樣本代碼:
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace ClassLibrary1 {
class CryptoAPI {
[DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean PFXIsPFXBlob(
[In]CRYPTOAPI_BLOB pPFX
);
[DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean PFXVerifyPassword(
[In] CRYPTOAPI_BLOB pPFX,
[MarshalAs(UnmanagedType.LPWStr)]
[In] String szPassword,
[In] UInt32 dwFlags
);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct CRYPTOAPI_BLOB {
public UInt32 cbData;
public IntPtr pbData;
}
}
public class Program {
public static Boolean TestPfxPwd(Byte[] rawData, String password) {
// check for input data
if (rawData == null) { throw new ArgumentNullException("rawData"); }
// allocate a buffer in an unmanaged memory to store PFX content
IntPtr pbData = Marshal.AllocHGlobal(rawData.Length);
// copy PFX content to allocated buffer
Marshal.Copy(rawData, 0, pbData, rawData.Length);
// instantiate CRYPTOAPI_BLOB structure as it will be used
// to call both functions
CryptoAPI.CRYPTOAPI_BLOB blob = new CryptoAPI.CRYPTOAPI_BLOB {
cbData = (UInt32)rawData.Length,
pbData = pbData
};
// determine if input byte array represents a PFX blob:
if (!CryptoAPI.PFXIsPFXBlob(blob)) {
// release unmanaged resources before leaving method
Marshal.FreeHGlobal(pbData);
throw new InvalidDataException("Input data is not valid PFX message.");
}
// call the PFXVerifyPassword function and store results in a temporary variable
Boolean retValue = CryptoAPI.PFXVerifyPassword(blob, password, 0);
// release unmanaged resources before leaving method
Marshal.FreeHGlobal(pbData);
// return pfx match status
return retValue;
}
}
}
感謝您的例子。我不知道本地的Windows API。但我的公司(我工作)有限制,以避免使用本機窗口API。 – 2015-02-12 08:29:23
由於大約一半的.NET(Cryptography命名空間的高達90%)是本地函數的包裝,我沒有看到本地函數的大問題。 – Crypt32 2015-02-12 08:41:12
我明白了。但具體來說,X509Certificate2類在Mono中有自己的實例。我們的客戶不應該依賴於Windows環境。這不是我的錯。這是生意。另一個觀點是你有什麼保證微軟不會改變原生API? – 2015-02-12 10:10:34