标签: digital-signature

使用Ruby或Ruby on Rails生成带签名的PDF

我正在研究一个使用prawn生成PDF的Rails应用程序.简而言之,我们希望能够对生成的PDF进行数字签名.我不知道从哪里开始准确阅读.只是想问一下其他人之前是否能够完成这项工作,如果是的话,我应该用什么样的资源来完成它.

谢谢!

ruby pdf-generation ruby-on-rails prawn digital-signature

5
推荐指数
2
解决办法
2732
查看次数

M2crypto签名“算法”

这两个代码提供相同的签名,这是预期的:

代码1:

from M2Crypto import RSA, EVP
import base64, hashlib

text = "some text"

pkey = EVP.load_key("mykey.pem")  #"mykey.pem" was generated as: openssl genrsa -des3 -out mykey.pem 2048
pkey.sign_init()
pkey.sign_update(text)
signature = pkey.sign_final()
print base64.b64encode(signature)
Run Code Online (Sandbox Code Playgroud)

代码2:

pkey = RSA.load_key("mykey.pem")
signature = pkey.sign(hashlib.sha1(text).digest())
print base64.b64encode(signature)
Run Code Online (Sandbox Code Playgroud)

但是,如果我想“模仿”签名算法,即用私钥加密摘要,则会得到一个不同的签名,即:

pkey = RSA.load_key("mykey.pem")
signature = pkey.private_encrypt(hashlib.sha1(text).digest(), RSA.pkcs1_padding)
print base64.b64encode(signature)  #different from the two above
Run Code Online (Sandbox Code Playgroud)

您能提供一些解释吗?后一种签名方式有什么问题?

python digital-signature m2crypto

5
推荐指数
1
解决办法
2872
查看次数

确保JavaScript没有被篡改

我正在编写一个Web应用程序,它对数据进行一些客户端加密,以确保我永远不会看到客户端发送到我的服务器的内容.我真正担心的是,如果第三方可以访问我的JavaScript代码,然后在我的JavaScript文件中添加后门或其他恶意代码.

由于JavaScript通常托管在第三方CDN上,如何在浏览器下载之前确保JavaScript文件未被更改或篡改?我宁愿在我的页面上有一个很大的安全通知,而不是在我的客户端浏览器中加载一些被篡改的JavaScript.

在正常的程序中,我会对文件进行数字签名,以确保它没有被篡改,但我认为浏览器不支持在下载和/或加载JavaScript文件之前检查给定的签名.必须有一些解决方案,否则托管CDN上的任何文件将是一个巨大的安全风险.SSL仅保护传输中的文件,而不是当它位于CDN服务器上时.

javascript security cryptography digital-signature

5
推荐指数
1
解决办法
978
查看次数

数字签名的PDF

我目前正在使用WKHTMLTOPDF在我的应用程序中生成PDF.

现在要求是对pdf进行数字签名(不是放置水印或标志图像),这可以真正验证pdf生成是仅来自应用程序.

我查看了这个插件http://www.setasign.com/products/setapdf-signer/details/, 但付了款.

有人可以帮我签署pdf吗?

其他问题非常受欢迎.

仅供参考 - 我使用PHP作为服务器端语言.提前致谢 :)

php pdf digital-certificate digital-signature wkhtmltopdf

5
推荐指数
0
解决办法
1490
查看次数

OpenSSL C ++ RSA标志与命令行标志不同

我正在尝试在C ++中签名文本,然后在命令行中进行验证。我正在使用OpenSSL库。这是我生成密钥的命令行:

openssl genrsa -out key.pem 1024
Run Code Online (Sandbox Code Playgroud)

现在我有了我的私钥。然后这就是我登录命令行的方式:

echo "hola" | openssl rsautl -pkcs -sign -inkey key.pem > sign.txt
Run Code Online (Sandbox Code Playgroud)

至此,所有工作似乎都正常了,现在我在sign.txt中登录了。现在,我试图在C中做同样的事情。这是我的代码:

RSA * rsaPrivKey;


RSA * createRSAWithFilename (const char * filename, int publicKey)
{
   FILE * fp = fopen (filename, "rb");

   if (fp == NULL)
   {
      printf ("Unable to open file %s \n", filename);
      return NULL;
   }
   RSA *rsa = RSA_new ();

   if (publicKey)
      rsa = PEM_read_RSA_PUBKEY (fp, &rsa, NULL, NULL);
   else
      rsa = PEM_read_RSAPrivateKey (fp, &rsa, NULL, NULL);

   return rsa; …
Run Code Online (Sandbox Code Playgroud)

c++ openssl rsa sign digital-signature

5
推荐指数
1
解决办法
2804
查看次数

如何在Android中签署PDF

我必须在Android应用程序中实现一个允许我签署PDF的功能,当我说"签名"时,我指的是用户在文档末尾贴上的数字签名(第一和第二名).

我可以访问三星Note 4(带手写笔),然后就不会出现问题,在显示屏上"写".

问题是:有可能使用像itext这样的库来签署文档,或者我必须编写自定义函数吗?

pdf android electronic-signature digital-signature handwriting

5
推荐指数
1
解决办法
4283
查看次数

Java - 获取密钥失败:java.security.InvalidKeyException:无效的RSA私钥和DerInputStream.getLength():找到冗余长度字节

我在使用PFX文件进行XML数字签名时遇到了一些麻烦.运行此代码时出现异常:

KeyStore ks = KeyStore.getInstance("PKCS12");

fs = new FileInputStream(file);

ks.load(fs, "password".toCharArray());

// this line!
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("alias", new KeyStore.PasswordProtection("password".toCharArray()));
Run Code Online (Sandbox Code Playgroud)

这是例外:

java.security.UnrecoverableKeyException: Get Key failed: 
java.security.InvalidKeyException: Invalid RSA private key
  at sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:435)
  at sun.security.pkcs12.PKCS12KeyStore.engineGetEntry(PKCS12KeyStore.java:1306)
  at java.security.KeyStore.getEntry(KeyStore.java:1521)
  at app.ubl.xml.GenerateSignature.makeSignatureXML(GenerateSignature.java:88)

Caused by: java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
  at sun.security.util.DerInputStream.getLength(DerInputStream.java:606)
  at sun.security.util.DerInputStream.getLength(DerInputStream.java:569)
  at sun.security.util.DerInputStream.getPositiveBigInteger(DerInputStream.java:220)
  at sun.security.rsa.RSAPrivateCrtKeyImpl.parseKeyBits(RSAPrivateCrtKeyImpl.java:205)
Run Code Online (Sandbox Code Playgroud)

真正的问题是代码在java中工作1.8.0_111,但错误显示的任何更高版本.

运行keytool时出现异常

我发现的另一个问题是当我使用以下命令运行此命令keytool:

keytool -list -keystore file.pfx -storepass password -storetype PKCS12 -v
Run Code Online (Sandbox Code Playgroud)

要显示PFX文件的详细信息,那么它只能用于java 1.8.0_111.否则我得到这个例外:

java.util.IllegalFormatConversionException: d != java.lang.String
    at …
Run Code Online (Sandbox Code Playgroud)

java xml keytool digital-signature pfx

5
推荐指数
1
解决办法
2435
查看次数

CNG替换CryptQueryObject

我有兴趣尝试从数字签名中读取字段.我有代码调用CryptQueryObject,然后CryptMsgGetParam来获取一些字段,最后是CertFindCertificateInStore来加载证书.

有关如何使用下一代加密API进行此操作的任何提示?微软告诉我CryptQueryObject已被弃用,但并未指出它的替代品.

digital-signature cng

5
推荐指数
1
解决办法
219
查看次数

需要帮助了解php签名验证

我正在尝试验证php中的签名,并且已经筋疲力尽地尝试了我在网上找到的每个例子.我已经绕圈子了,所以我现在可能已经错过了解决方案.

所以我有测试数据

$msg = "test data";
Run Code Online (Sandbox Code Playgroud)

使用我的密钥对中的私钥生成此签名

$signature = "avALtk00btVyV74e5UdXJ/VClVV/fsuoLZpXQjiCrkVijsmMZsYWZujN56+Aa2CEQYkomDsm9CJ/Tue7lNP0tYVZz9Y0RngpcV9VT9V3i+3rbvbBEnuJuS/5e+PR7kQGMh8rVuCtHpAJhSePMyipC3kM90EQJ0jyY3rFaHDNpSzVBpOnRYLzqbsdy45v0bN78A2J/HaIhJy87Sh4X1a+WMg9PLkqSSYZnRYOB8XVDCYfyeeekcvI4rvP51wBQcaLwu7S0xPQA8yHfJqMXCqdmBVUQZrk/X+CujdXUyJItDWA8j2N8AHmcAD5oRaJ6bX3zCQFM1QnKMi1ETLudzIqfA==";
Run Code Online (Sandbox Code Playgroud)

这是签名密钥对的公钥

$key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxv4nCiH4vXvSLsvlceCOk3yfH1EQgNqNaVGdnFxdw9IIjSVZvTVH45NCodCJ0GlHoDwQM7DMV1+QrtF91cn44xg4Ys9zr1xkaT4jWBTe3YKoTqJoLHR4UU03F6Y1jTELhjY2a2Kt0ijyvAOKM4bm3gCItfMx59ETGInz7Oubb1T4IJ8TuWmZsh+X57c6fgv0B2+eTr/5FMK2VxXV5tHkB9UNLBgnbw0IZuC6izF4OFk9hxgh96i5wCf2HhHaNoEryx7ZV2ZG9a0OQnYZ+x1zaOIw6dJkV7rip3H57ksQfoQWM0GKMBB7cWIgWsf/GlbYTVgw26MvzEzGPb9uCfx8rwIDAQAB";
Run Code Online (Sandbox Code Playgroud)

我试过用这个包装钥匙

$pubkey = "-----BEGIN RSA PUBLIC KEY-----" . $key . "-----END RSA PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)

并与此

$pubkey = "-----BEGIN PUBLIC KEY-----" . $key . "-----END PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用两个包装创建一个公钥ID,没有任何包装,就像这样

$pubkeyid = openssl_pkey_get_public($pubkey);
$pubkeyid = openssl_pkey_get_public($key);
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用$ key和$ pubkeyid验证签名,使用各种算法,没有,就像这样

openssl_verify($msg, base64_decode($signature), $pubkeyid);
openssl_verify($msg, base64_decode($signature), $key);
openssl_verify($msg, base64_decode($signature), $pubkeyid, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $key, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $pubkeyid, OPENSSL_ALGO_SHA256);
openssl_verify($msg, base64_decode($signature), $key, OPENSSL_ALGO_SHA256);
Run Code Online (Sandbox Code Playgroud)

我可能尝试了其他一些排列,但现在不记得了.我头疼.

无论我尝试什么,我都没有设法验证签名.我可以轻松地使用java中的公钥来验证签名.

我讨厌要求一个有效的PHP示例,因为我已经尝试了很多我已经在网上找到的并且无法让它们工作.不幸的是phpseclib对我来说不是一个选择,所以我必须使用openssl.

我哪里错了?

php openssl digital-signature

5
推荐指数
1
解决办法
122
查看次数

使用C#将数字签名应用于office-vba-macros

在互联网上搜索了一段时间后,没有成功,我会在这里询问。

互联网上的一些帖子说,不可能在Excel应用程序中将数字签名应用于VBA-Macro。但是我发现的所有文章都很老,所以我希望现在可以通过代码来完成。

我的目标是打开Excel文档,并假设存在宏,将数字签名应用于该文档的vba-macros。

我有以下代码来检测excel文档中是否存在VBMacros:

string filePath = @"E:\OfficeDocuments\Sample1.xlsm";
object isReadonly = true;
object missing = Missing.Value;
_Application application = new Microsoft.Office.Interop.Excel.Application();
workbook = application.Workbooks.Open(
                    filePath, missing, isReadonly, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing,
                    missing, missing, missing);
bool workbookHasVbProject = workbook.HasVBProject;
Run Code Online (Sandbox Code Playgroud)

那很好。

现在,我获取要用于签署宏的证书:

X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection x509Certificate2Collection = store.Certificates;
X509Certificate2Collection certificate2Collection = x509Certificate2Collection.Find(X509FindType.FindBySubjectName, "MyCertificate 01", true);
if (certificate2Collection.Count > 0)
{
   X509Certificate2 certificate = certificate2Collection[0];
}
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何继续...

我试过了:

VBE vbe = application.VBE;
VBProject vbProject …
Run Code Online (Sandbox Code Playgroud)

c# excel digital-signature

5
推荐指数
1
解决办法
174
查看次数