我必须在Android应用程序中实现一个允许我签署PDF的功能,当我说"签名"时,我指的是用户在文档末尾贴上的数字签名(第一和第二名).
我可以访问三星Note 4(带手写笔),然后就不会出现问题,在显示屏上"写".
问题是:有可能使用像itext这样的库来签署文档,或者我必须编写自定义函数吗?
pdf android electronic-signature digital-signature handwriting
当我使用需要用户身份验证才能使用密钥的 AndroidKeyStore 时,我的应用程序进入无限循环
.setUserAuthenticationRequired(true);
.setUserAuthenticationValidityDurationSeconds(60);
Run Code Online (Sandbox Code Playgroud)
假设使用用户私钥的操作要求设备已解锁,否则UserNotAuthenticatedException生成a。应用程序必须显示设备身份验证屏幕,并且密钥的下次使用才会起作用。
但是,就我而言,总是会强制UserNotAuthenticatedException应用程序显示解锁屏幕。它仅发生在某些设备中。我有两台运行 Android 6.0.1 的 Nexus 5,只有其中一台出现故障。
这是活动的主要代码
KeyPair keyPair;
private void attemptRegisterKey(){
try{
//generate key pair using AndroidKeyStore only once.
if (keyPair != null)
generateKeyPair(alias);
//Sample Signature
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(keyPair.getPrivate());
sig.update("hello".getBytes());
byte signature[] = sig.sign();
}catch (UserNotAuthenticatedException e){
//show Authentication Screen
Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
// Challenge completed, …Run Code Online (Sandbox Code Playgroud) 我有公钥和私钥作为字符串,它们是从Webcrypto API RSA-OAEP算法生成的.我想通过使用那些纯文本加密和解密,并在尝试将字符串转换为字节数组时获得异常
Java代码:
package mailsend;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;
public class RsaOaep {
public static void main(String[] args) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//Encryption
byte[] input = "{\"userid\":\"1242\",\"appid\":\"1234\",\"tenentid\":\"4567\",\"sessionid\":\"session1234567\"}".getBytes();
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
SecureRandom random = new SecureRandom();
String publicKey="{\n" +
" \"alg\": \"RSA-OAEP-256\",\n" +
" \"e\": \"AQAB\",\n" +
" \"ext\": true,\n" +
" \"key_ops\": [\n" +
" \"encrypt\"\n" +
" ],\n" +
" \"kty\": \"RSA\",\n" + …Run Code Online (Sandbox Code Playgroud) 所以,现在我正在构建一个供第三方使用的API,我正在阅读有关RS256和HS256的内容.我所理解的是,在第一个中你使用公钥验证和私钥进行签名,而另一个只使用一个密钥..所以如果你使用RS256,因为你想保留你的安全密钥并希望客户端验证令牌,但我不明白为什么要在客户端验证令牌?因为您向服务器发送了一个发布请求,然后它会向您发回一个令牌,每当您想要发出授权请求时,您只需使用该令牌,服务器就会对其进行验证,如果可以,则让您继续.那么,为什么要在客户端验证令牌?我认为这是后端的责任.
我想也许我错了什么,希望你能帮忙解决这个问题.谢谢.
编辑:
所以,我的问题是,我知道RS256和HS256之间的区别,但我不明白它是如何使用它的流程.现在我正在开发第三方api,我只需要在客户端请求它时返回令牌,然后在需要它的请求中,只需从服务器验证它是否是有效令牌.根据我的理解,当您想要从客户端验证令牌时使用RS256,如果这是正确的,有人可以举例说明您何时或为什么要在客户端验证令牌?
我正在寻找一个注册证书的程序.
我已经搜索了很多,但没有找到一个好的答案.到目前为止,我首先要生成一个密钥库(用于创建公钥和私钥),然后私钥应该保密,公钥发送与CA的其他信息(如姓名,组织).然后CA将生成一些内容,并返回包含公钥和信息的内容.
直到现在我得到了这个,但CA产生了什么?什么是P12文件,什么是.cer文件包含?
任何人都可以帮我解决这个问题,我真的感到无助.提前致谢.
一个collegue和我一直在试图了解如何JWT令牌验证令牌,但是从我们的阅读,我们似乎会混淆自己。
请有人可以帮助确认是否我的想法是正确的
我看了两个RS256和HS256并仍在努力确认了我的思维,因此后期的智威汤逊文档。
我的应用程序正在使用 JWT,应该可以防止重放攻击。我正在测试这个并遇到以下问题。
当我有一个有效的 JWT 并更改令牌/签名的最后一个字符时,JWT 仍然有效。例如,以下令牌都正确验证:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r4
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r5
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r6
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r7
我已经在http://jwt.io/上检查过这个,也可以在我的 .Net 应用程序中复制。
有人能解释一下签名对于给定的有效载荷是如何可能不是唯一的吗?我知道可能会发生碰撞,但我无法解释它们是连续的序列。
我已经在java卡中生成了密钥对并返回公钥。我在 android 应用程序中再次生成公钥,然后在 android 中生成 CSR
private byte[] CertReqGeneration() throws Exception
{
if(publickeyobj==null)
return null;
String info = "CN=cn, OU=ou, O=o, C=cn, ST=city";
X500Principal x500 = new X500Principal(info);
X500Name x500name;
x500name= X500Name.getInstance(x500.getEncoded());
CertificationRequestInfo csrInfo = new CertificationRequestInfo(x500name, publickeyobj, new DERSet());
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(csrInfo);
ASN1ObjectIdentifier oid = new ASN1ObjectIdentifier("0.0");
v.add(new DERSequence(oid));
v.add(new DERBitString(new byte[] {}));
byte[] encoded = new DERSequence(v).getEncoded();
byte[] PKCS10= DataSignGeneration(encoded);
byte[] encoded = Base64.encode(PKCS10);
String base64=new String(encoded);
return base64;
}
Run Code Online (Sandbox Code Playgroud)
但是当我想在 ca 中发布它时,我收到错误 asn1 bad …
厌倦了这个令人讨厌的错误:
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
at org.apache.catalina.util.ParameterMap.put(ParameterMap.java:164)
at org.springframework.data.rest.webmvc.RestRepositoryEntityController.getParametersForPostAction(RestRepositoryEntityController.java:182)
at org.springframework.data.rest.webmvc.RestRepositoryEntityController.performPostAction(RestRepositoryEntityController.java:158)
at org.springframework.data.rest.webmvc.RestRepositoryEntityController.performOneArgumentPostRepositoryAction(RestRepositoryEntityController.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:747)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
Run Code Online (Sandbox Code Playgroud)
我在尝试访问一些休息资源后得到了这个。一切在生产上都可以正常工作,所以我想我的本地PC上有一些tomcat问题。花两个小时试图找到答案,但没有成功。
有没有人发生过相同的错误?需要帮忙!
我想使用 sha512 和迭代计数将我的字符串转换为 PBKDF2。我在 nodejs 中使用“pbkdf2”模块做了。我如何在 angular JS 中实现相同的目标。
在登录,提交和重定向期间管理JWT令牌令我有些沮丧。在开始之前,这里是我的技术栈,以防万一:
JQuery/Html -> Node.Js -> Java Restful Services -> MySQL.
Run Code Online (Sandbox Code Playgroud)
我的Java Restful服务管理着创建JWT令牌的过程,将其返回到Node.js层,该层决定如何处理它并将其传递给客户端。这一切都很棒。
为了获得JWT令牌,我向Node中间层提出了一个基于Ajax的身份验证请求,该请求对中间层进行身份验证并返回该令牌,该令牌被汇总到客户端的本地存储中。
现在,我不再希望通过ajax将整个站点加载到单个页面上,这是一个复杂的站点,这样做简直是愚蠢的!我需要在携带JWT令牌的同时转发并导航到子页面。
(最终)这是问题。。。如何将JWT令牌发送到中间层(node.js),而又不将其附加为请求或发布参数,因为那是很大的不?我似乎找不到一种将其填充到Bearer相关联的标头中的方法。
无辜地,我认为"SHA1withRSA算法"只是用"SHA1"操作plainText,并使用RSA/pkcs1padding来加密"SHA1"的结果.但是,我发现我错了,直到我写了一些java代码来测试我的想法.我使用RSA publickey来解密签名,我使用相应的私钥来签署"SHA1withRSA算法".但我发现结果不等于"SHA1(plainText)",下面是我的java代码:
String plaintext= "123456";
Signature signature=Signature.getInstance("SHA1withRSA",new BouncyCastleProvider());
signature.initSign(pemPrivatekey);
signature.update(plaintext.getBytes());
byte[] sign = signature.sign();
//RSA decode
byte[] bytes = RsaCipher.decryptByRsa(sign, pemPublickey);
String rsaDecodeHex=Hex.toHexString(bytes);
System.out.println(rsaDecodeHex.toLowerCase());
String sha1Hex = Hash.getSha1(plaintext.getBytes());
System.out.println(sha1Hex);
//rsaDecodeHex!=sha1Hex
Run Code Online (Sandbox Code Playgroud)
很容易找到rsaDecodeHex!=sha1Hex,在哪里
rsaDecodeHex = 3021300906052b0e03021a050004147c4a8d09ca3762af61e59520943dc26494f8941b
和
sha1Hex = 7c4a8d09ca3762af61e59520943dc26494f8941b.
那么,"SHA1withRSA"的细节是什么?
android ×4
java ×4
jwt ×4
cryptography ×3
rsa ×3
base64 ×2
csr ×2
encryption ×2
hmac ×2
node.js ×2
ajax ×1
angularjs ×1
bouncycastle ×1
certificate ×1
handwriting ×1
javacard ×1
javascript ×1
jquery ×1
pbkdf2 ×1
pdf ×1
pkcs#12 ×1
rest ×1
sha1 ×1
spring ×1
spring-rest ×1
tomcat ×1