java的签名是什么意思(apk签名是什么意思)
大家好,关于java的签名是什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于apk签名是什么意思的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
Java加密和数字签名
Java加密和数字签名本文主要谈一下密码学中的加密和数字签名以及其在java中如何进行使用对密码学有兴趣的伙伴推荐看 Bruce Schneier的著作 Applied Crypotography在jdk的发行版本中安全性方面有了很大的改进也提供了对RSA算法的直接支持现在我们从实例入手解决问题(本文仅是作为简单介绍)
一密码学上常用的概念
)消息摘要
这是一种与消息认证码结合使用以确保消息完整性的技术主要使用单向散列函数算法可用于检验消息的完整性和通过散列密码直接以文本形式保存等目前广泛使用的算法有MD MD SHA jdk对上面都提供了支持在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法
/***MessageDigestExample java*Copyright*/ import java security MessageDigest;/***单一的消息摘要算法不使用密码可以用来对明文消息(如密码)隐藏保存*/ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java MessageDigestExample text); System exit();}
byte[] plainText=args[ ] getBytes( UTF);
//使用getInstance(算法)来获得消息摘要这里使用SHA的位算法 MessageDigest messageDigest=MessageDigest getInstance( SHA);
System out println( \n+messageDigest getProvider() getInfo());//开始使用算法 messageDigest update(plainText); System out println( \nDigest:);//输出算法运算结果 System out println(new String(messageDigest digest() UTF));}}还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案有兴趣者可以参考相关API文档本文只是简单介绍什么是摘要算法
这里补充另一个运用消息摘要的方式加密的例子: public class TestEncrypt{
public TestEncrypt(){}
/***@param strSrc:strSrc is a string will be encrypted*@param encName: encName is the algorithm name will be used* encName dafault to MD*@return String*/ public String Encrypt(String strSrc String encName){
MessageDigest md= null; String strDes= null;
byte[] bt= strSrc getBytes(); try{ if(encName== null|| encName equals()){ encName= MD;} md= MessageDigest getInstance(encName); md update(bt); strDes= bytes Hex(md digest());//to HexString} catch(NoSuchAlgorithmException e){ System out println( Invalid algorithm); return null;} return strDes;}
public String bytes Hex(byte[] bts){ String des=; String tmp= null; for(int i=; i< bts length; i++){ tmp=(Integer toHexString(bts[i]& xFF)); if(tmp length()==){ des+=;} des+= tmp;} return des;}
public static void main(String[]args){ TestEncrypt te= new TestEncrypt(); String strSrc=可以加密汉字 Oh and english; System out println( Source String:+ strSrc); System out println( Encrypted String:); System out println( Use Def:+ te Encrypt(strSrc null)); System out println( Use MD:+ te Encrypt(strSrc MD)); System out println( Use SHA:+ te Encrypt(strSrc SHA)); System out println( Use SHA:+ te Encrypt(strSrc SHA));}}
另外在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD的方法代码如下: public static String generateGUID(HttpServletRequest request){
String out=; try{// Construct a string that is prised of:// Remote IP Address+ Host IP Address+ Date(yyyyMMdd)+// Time(hhmmssSSa)+ Requested Path+ Session ID+// HashCode Of ParameterMap StringBuffer***= new StringBuffer();*** append(request getRemoteAddr()); InetAddress ia= InetAddress getLocalHost();*** append(ia getHostAddress());*** append(new SimpleDateFormat( yyyyMMddhhmmssSSa) format(new Date())); String path= request getServletPath(); String pathInfo= request getPathInfo(); if(pathInfo!= null){ path+= pathInfo;}*** append(path);*** append(request getSession(false));*** append(request getParameterMap() hashCode()); String str=*** toString();// Now encode the string using an MD encryption algorithm MessageDigest md= MessageDigest getInstance( md); md update(str getBytes()); byte[] digest= md digest(); StringBuffer hexStr= new StringBuffer(); for(int i=; i< digest length; i++){ str= Integer toHexString( xFF& digest[i]); if(str length()<){ str=+ str;} hexStr append(str);} out= hexStr toString();} catch(NoSuchAlgorithmException nsae){ log error(nsae);} catch(UnknownHostException uhe){ log error(uhe);}// Return the encrypted string It should be unique based on the// ponents that prise the plain text string and should always be// characters thanks to the MD algorithm return out;
}// End generateGUID()
)私钥加密
消息摘要只能检查消息的完整性但是单向的对明文消息并不能加密要加密明文的消息的话就要使用其他的算法要确保机密性我们需要使用私钥密码术来交换私有消息
这种最好理解使用对称算法比如 A用一个密钥对一个文件加密而B读取这个文件的话则需要和A一样的密钥双方共享一个私钥(而在web环境下私钥在传递时容易被侦听)
使用私钥加密的话首先需要一个密钥可用javax crypto KeyGenerator产生一个密钥(java security Key)然后传递给一个加密工具(javax crypto Cipher)该工具再使用相应的算法来进行加密主要对称算法有 DES(实际密钥只用到位) AES(支持三种密钥长度位)通常首先位其他的还有DESede等 jdk种也提供了对对称算法的支持以下例子使用AES算法来加密
/***PrivateExmaple java*Copyright*/ import javax crypto Cipher; import javax crypto KeyGenerator; import java security Key;
/***私鈅加密保证消息机密性*/ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PrivateExample<text>); System exit();} byte[] plainText=args[ ] getBytes( UTF);
//通过KeyGenerator形成一个key System out println( \nStart generate AES key); KeyGenerator keyGen=KeyGenerator getInstance( AES); keyGen init(); Key key=keyGen generateKey(); System out println( Finish generating DES key);
//获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法 Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
//使用私鈅加密 System out println( \nStart encryption:); cipher init(Cipher ENCRYPT_MODE key); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
System out println( \nStart decryption:); cipher init(Cipher DECRYPT_MODE key); byte[] newPlainText=cipher doFinal(cipherText); System out println( Finish decryption:);
System out println(new String(newPlainText UTF));
}}
)公钥加密
上面提到私钥加密需要一个共享的密钥那么如何传递密钥呢?web环境下直接传递的话很容易被侦听到幸好有了公钥加密的出现公钥加密也叫不对称加密不对称算法使用一对密钥对一个公钥一个私钥使用公钥加密的数据只有私钥能解开(可用于加密)同时使用私钥加密的数据只有公钥能解开(签名)但是速度很慢(比私钥加密慢到倍)公钥的主要算法有RSA还包括Blowfish Diffie Helman等 jdk种提供了对RSA的支持是一个改进的地方
/***PublicExample java*Copyright*/ import java security Key; import javax crypto Cipher; import java security KeyPairGenerator; import java security KeyPair;/***一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PublicExample<text>); System exit();}
byte[] plainText=args[ ] getBytes( UTF);//构成一个RSA密钥 System out println( \nStart generating RSA key); KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA); keyGen initialize(); KeyPair key=keyGen generateKeyPair(); System out println( Finish generating RSA key);
//获得一个RSA的Cipher类使用公鈅加密 Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
System out println( \nStart encryption); cipher init(Cipher ENCRYPT_MODE key getPublic()); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
lishixinzhi/Article/program/Java/hx/201311/26898数字签名的Java签名步骤
1、将applet的class文件打包成*.jar(不会的可以在命令行中输入jar查看帮助)
2首先我们要生成一个keystore否则在签名的时候报如下错误
jarsigner错误: java.lang.RuntimeException:密钥库装入: C:\Documents and Settings\ij2ee\.keystore(系统找不到指定的文件。).(这边的ij2ee是我当前系统用户名)
生成keystore的语句:keytool-genkey-alias别名你可以自己写-keyalg RSA-keystore.keystore
比如我的就是 keytool-genkey-alias ij2ee-keyalg RSA-keystore.keystore
下面是会出现的数字签名的一些步骤操作:
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: ij2ee
您的组织单位名称是什么?
[Unknown]: mtk
您的组织名称是什么?
[Unknown]: mtk
您所在的城市或区域名称是什么?
[Unknown]: suzhou
您所在的州或省份名称是什么?
[Unknown]: jiangsu
该单位的两字母国家代码是什么
[Unknown]: cn
CN=ij2ee, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn正确吗?
[否]: y
输入<sfcs>的主密码
(如果和 keystore密码相同,按回车):
这时候会在jdk的bin目录下生成.keystore。把这个.keystore文件移动到 C:\Documents and Settings\当前系统用户的目录下面。
3、创建一个数字证书
在命令行中输入如下指令,peakCA和peakCALib自己起名字好了,3650是有效天数,就是10年左右,在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,都是中文,一看就懂的
keytool-genkey-alias peakCA-keyalg RSA-keysize 1024-keystore peakCALib-validity 3650
4、将证书导出到证书文件中
在命令行中输入如下指令,peakCA和peakCALib自己起名字好了,******是你输入的密码
keytool-export-alias peakCA-file peakCA.cer-keystore peakCALib-storepass******-rfc
5、授权jar文件,在命令行中输入如下指令
jarsigner-keystore peakCALib myapplet.jar peakCA
java语言中什么是签名
签名一般是使用公私密钥对。自己使用私钥加密,其他人可以任意获取到公钥用来解密,既然解出来了,就说明是私钥加密的。用私钥加密的过程叫做签名。
当然实际过程没这么简单,还包括,找个合适的第三方再次签名公钥已证明公钥的安全性等。不过只要知道上面的东西基本就可以了。
apk签名是什么意思
apk是安卓应用软件包,apk签名是软件包在安装的时候进行的安全性验证机制。
这种签名机制目的是为了确保Apk来源的真实性,以及Apk没有被第三方篡改。开发者通过对Apk进行签名:在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。
扩展资料:
1、APK的格式定义
在Android平台中,dalvikvm的执行文件被打包为apk格式,最终运行时加载器会解压,然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下,会发现执行是不受限制的。安装的文件可能不是这个文件夹,而在androidrom中,系统的apk文件默认会放入这个文件夹,它们拥有着root权限。
2、APK的开发环境
Android是一个基于Java的开发环境,Google也在API文档的书写和样例的提供上做了很出色的工作。
3、获取SDK
下载并安装android的SDK[软件开发套件],这套SDK主要包括有核心库文件,一个模拟器,开发工具和一些示范的样例文件。推荐使用Eclipse和androideclipse扩展。如果只是使用android,Eclipse IDE就已经足够了,但如果是第一次开发Java应用,建议下载完整的Java SE开发工具(JDK)因为它包括签发应用程序所需要的工具。
4、APK应用架构
android应用架构很关键,如果不学习它,设计出来的游戏将是一种很难修复bug的产品。需要了解应用程序、活动、Intents以及它们是如何互相联系交互的,Google在这儿提供了良好的信息架构。真正重要的是,要理解为什么在设计的游戏中,需要不止一个的活动进程,以及如何设计一个用户体验良好的游戏。这些都应当配合到应用的生命周期中。
5、APK应用的生命周期
应用的生命周期是由Android OS操作系统进行管理的,活动进程都将作为系统命令进行创建,正确处理这些事件对一个应用程序来说是极为重要的,因为终端用户不会知道什么是正确的。最好在开始设计游戏之前搞明白这些,因为这有助于节省调试时间以及避免代价高昂的重新设计。
对大多数应用而言,默认设置即可开始工作,但对游戏而言,可能需要调整单态实例的信号为打开。在默认情况下,Android会新建一个活动实例进程,因为它认为这是比较合适的,而游戏,可能只希望有一个活动的实例进程,这有一点儿影响,它需要了解一些系统状态的管理。
参考资料来源:百度百科-apk
参考资料来源:百度百科-android软件开发
OK,关于java的签名是什么意思和apk签名是什么意思的内容到此结束了,希望对大家有所帮助。