- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个使用证书对字符串进行签名的 Java 应用程序。它使用 SHA1 加密字符串。我正在尝试将代码转换为 Delphi 2010,但我不知道如何让它以与 java 应用程序相同的方式工作(使用 sha1)。到目前为止,我发现了这个:
Delphi 7 access Windows X509 Certificate Store
它确实有效,但它不使用 sha1,当我运行 java 应用程序时我得到了不同的结果。
char[] pass = (char[]) null;
PrivateKey key = (PrivateKey) getKeyStore().getKey(alias, pass);
Certificate[] chain = getKeyStore().getCertificateChain(alias);
CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
X509Certificate cert = (X509Certificate) chain[0];
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certsAndCRLs);
CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
byte[] envHex = signed.getEncoded();
CertInfo certInfo = new CertInfo();
certInfo.Hash = new BigInteger(envHex).toString(16);
return certInfo;
var
lSigner: TSigner;
lSignedData: TSignedData;
fs: TFileStream;
qt: integer;
ch: PChar;
msg : WideString;
content : string;
cert: TCertificate;
begin
cert := Self.GetCert;
content := 'test';
lSigner := TSigner.Create(self);
lSigner.Certificate := cert.DefaultInterface;
lSignedData := TSignedData.Create(self);
lSignedData.content := content;
msg := lSignedData.Sign(lSigner.DefaultInterface, false, CAPICOM_ENCODE_BASE64);
lSignedData.Free;
lSigner.Free;
编辑
根据 java 代码,我应该获取二进制格式的证书信息,在其上应用 sha1 并将其转换为十六进制吗?这是正确的顺序和 java 代码所做的相同的事情吗?我可以在 capicom tlb 中看到一些 SHA1 常量以及一个哈希类,也许我应该使用这些类,但我不知道如何使用。
最佳答案
我们使用 DCPCrypt在一些与我们的 Java Tomcat 应用程序交互并能够获得 SHA-256 兼容哈希的 delphi 应用程序中。我怀疑 SHA1 也很简单。
举个例子
function Sha256FileStreamHash(fs : TFileStream): String;
var
Hash: TDCP_sha256;
Digest: array[0..31] of byte; // RipeMD-160 produces a 160bit digest (20bytes)
i: integer;
s: string;
begin
if fs <> nil then
begin
fs.Seek(0, soFromBeginning);
Hash:= TDCP_sha256.Create(nil); // create the hash
try
Hash.Init; // initialize it
Hash.UpdateStream(fs,fs.Size); // hash the stream contents
Hash.Final(Digest); // produce the digest
s:= '';
for i:= 0 to 31 do
s:= s + IntToHex(Digest[i],2);
Result:= s; // display the digest
finally
Hash.Free;
end;
end;
end;
关于java - Capicom 和 SHA1 - 帮助将 Java 代码转换为 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431803/
复制代码 代码如下: '****************************************************************************** ' ' TH
因此,在 Windows 7 之前,有一个 Microsoft ActiveX 组件:CAPICOM,可以从 Javascript 调用它,然后显示客户端机器上证书存储的内容。然后客户端可以选择适当的
这个问题已经有答案了: VB6 Program Crashing: Part 2. Advice on fixing Access Violation (0xC00000005) (1 个回答) 已关
我想在 C# 中使用 CryptoAPI 来访问证书存储和签署消息。 This MSDN article "CAPICOM: CryptoAPI Made Easy"显示了 2 种方法:使用 CAPI
我有一个使用 RC4 的 Windows CAPICOM 库加密的数据库。以下 PHP 脚本在 Windows 服务器上运行良好。 ... $oCapiCapi = new COM("CAPI
我正在使用CAPICOM装配VBS加密某些逻辑text ,这效果很好,但是当尝试使用 Java 复制相同内容时,问题就开始了。 . 这是我的 VBS 代码: Option Explicit Dim s
我的组件负责从服务器下载文件。作为文件验证的一部分,我使用 CAPICOM(SignedCode 对象)来验证证书是否包含特定字符串并调用 SignedCode 对象的 Validate 方法。如果文
我在 .NET 3.0 C# 应用程序中使用 CAPICOM 检查 exe 文件上的 Authenticode 签名。我需要确保该证书被列为受信任的发布者。如果证书尚未受信任,使用 signedCod
我有一个使用证书对字符串进行签名的 Java 应用程序。它使用 SHA1 加密字符串。我正在尝试将代码转换为 Delphi 2010,但我不知道如何让它以与 java 应用程序相同的方式工作(使用 s
我正在尝试停止使用 CAPICOM,因为我不能再使用它(64 位 Windows 7 机器)。 现有的使用TripleDES的代码是这样的: EncryptedDataClass cryptic =
我正在为安装程序 DLL 编写一个函数来验证系统上已安装的 EXE 文件的 Authenticode 签名。 函数需要: A) verify that the signature is valid.
我想知道这种方法是否可以安全地用于登录,因为这是我发现的唯一一种易于理解的方法,并且它是 asp-classic,因此我是一个菜鸟可以理解并添加到我拥有的站点。 谢谢 here i woul
在经典 ASP (VBScript) 中使用 CAPICOM 执行 MD5 哈希时,如下所示: With server.CreateObject("CAPICOM.HashedData") .
我是一名优秀的程序员,十分优秀!