获取Android签名证书的公钥和私钥的简单实例

本文以Android签名JKS格式的证书为例:

package com.test;

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;

public class SignTest {

  public static void main(String[] args) {

    try {
      // 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
      FileInputStream fis2 = new FileInputStream("G:\\shanhytest.keystore");
      KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
      char[] kspwd = "shanhytest".toCharArray(); // 证书库密码
      char[] keypwd = "shanhytest".toCharArray(); // 证书密码
      String alias = "shanhytest";// 别名
      ks.load(fis2, kspwd); // 加载证书
      PrivateKey privateKey = (PrivateKey) ks.getKey(alias, keypwd); // 获取证书私钥
      PublicKey publicKey = ks.getCertificate(alias).getPublicKey();// 获取证书公钥
      fis2.close();

      System.out.println("privateKey = " + getKeyString(privateKey));
      System.out.println("publicKey = " + getKeyString(publicKey));

      // 测试加密解密字符串
      String srcContent = "今天天气不错。";

      // 将字符串使用公钥加密后,再用私钥解密后,验证是否能正常还原。
      // 因为非对称加密算法适合对小数据量的数据进行加密和解密,而且性能比较差,所以在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
      byte[] d1 = crypt(publicKey, srcContent.getBytes(), Cipher.ENCRYPT_MODE);
      byte[] d2 = crypt(privateKey, d1, Cipher.DECRYPT_MODE);
      System.out.println(new String(d2));

    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  /**
   * 将KEY转换为字符串
   *
   * @param key
   * @return
   * @author SHANHY
   */
  private static String getKeyString(Key key) {
    byte[] keyBytes = key.getEncoded();
    String s = new String(org.apache.commons.codec.binary.Base64.encodeBase64(keyBytes));
    return s;
  }

  /**
   * 加密/解密
   *
   * @param key
   *      私钥打包成byte[]形式
   * @param data
   *      要解密的数据
   * @param opmode
   *      操作类型(Cipher.DECRYPT_MODE为解密,Cipher.ENCRYPT_MODE为加密)
   * @return 解密数据
   */
  public static byte[] crypt(Key key, byte[] data, int opmode) {
    try {
      long startTime = System.currentTimeMillis();
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//jdk默认标准
//     Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");// android默认标准
      cipher.init(opmode, key);

      byte[] result = cipher.doFinal(data);

      System.out.println((Cipher.DECRYPT_MODE==opmode?"解密":"加密") + "耗时:" + (System.currentTimeMillis() - startTime));
      return result;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;

  }

}

以上这篇获取Android签名证书的公钥和私钥的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现获取签名及公钥的方法

    本文实例讲述了Android实现获取签名及公钥的方法.分享给大家供大家参考.具体如下: 1. java代码如下: private byte[] getSign(Context context) { PackageManager pm = context.getPackageManager(); List<PackageInfo> apps = pm .getInstalledPackages(PackageManager.GET_SIGNATURES); Iterator<Package

  • Android 获取签名公钥和公钥私钥加解密的方法(推荐)

    如下所示: public class GetPublicKey { /** * 获取签名公钥 * @param mContext * @return */ protected static String getSignInfo(Context mContext) { String signcode = ""; try { PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo( GetAppInfo.g

  • 获取Android签名证书的公钥和私钥的简单实例

    本文以Android签名JKS格式的证书为例: package com.test; import java.io.FileInputStream; import java.security.Key; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.Cipher; public class SignTest { pu

  • 修改Android签名证书keystore的密码、别名alias以及别名密码

    Eclipse ADT的Custom debug keystore自定义调试证书的时候,Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指纹hash来识别的(百度地图SDK.又或是微信sdk.新浪微博的sdk),这样如果使用默认自动生成的debug keystore的话就会给开发调试工作带来一些麻烦.因为在生成这些开放平台需要带签名的apk生成的签名信息,再去申请到最后的秘钥.这时可以通过修改正式的release keystore,生

  • Android 中自定义ContentProvider与ContentObserver的使用简单实例

    Android 中自定义ContentProvider与ContentObserver的使用简单实例 示例说明: 该示例中一共包含两个工程.其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver监听自定义ContentProvider的数据变化 以下代码为工程TestContentProvider ContentProviderTest如下: package cn.testcontentp

  • js中获取 table节点各tr及td的内容简单实例

    <table id="tb1" width="200" border="1" cellpadding="4" cellspacing="0"> <tr> <td height="25">第一行</td> </tr> <tr> <td height="25">第二行</td>

  • javascript实现获取指定精度的上传文件的大小简单实例

    js实现获取指定精度的上传文件的大小,主要采用html和JavaScript,用浏览器运行下述代码,按照操作:选择文件->获得文件大小的顺序,即可. 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>获得文件大小</title> </head> <body> <f

  • Android 应用中插入广告详解及简单实例

    想必大家都知道,国内的Android应用基本都是免费的,那么开发者如何获得收入呢?应用中插入广告是一个比较常用的盈利手段.本文就讲解如何在Android应用中插入广告. 国内的广告平台有很多,用户数量比较多的有万普,有米,多普.下面就不一一介绍了,免得说我打广告.本文以万普为例. 1.首先去万普官网下载sdk,把sdk里面的jar包导入到项目的lib目录下.        2.修改AndroidManifest.xml文件. 确保应用具有以下几项权限: XML/HTML代码 <uses-perm

  • Android Button的基本用法详解及简单实例

    Android Button的基本用法详解 Button的Click点击事件处理: mButtonBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Log.e("================", "MenuBackBtnListen"); MenuimageView.setVisibility(View.INVISIBLE); mB

  • Android自定义ViewGroup(侧滑菜单)详解及简单实例

    自定义侧滑菜单的简单实现 不少APP中都有这种侧滑菜单,例如QQ这类的,比较有名开源库如slidingmenu. 有兴趣的可以去研究研究这个开源库. 这里我们将一种自己的实现方法,把学习的 东西做个记录,O(∩_∩)O! 首先看效果图: 这里我们实现的侧滑菜单,是将左侧隐藏的菜单和主面板看作一个整体来实现的,而左侧隐藏的菜单和主面板相当于是这个自定义View的子View. 首先来构造该自定义View的布局: 自定义的SlideMenuView包含两个子view,一个是menuView,另一个是m

  • Android获取apk签名指纹的md5值(防止重新被打包)的实现方法

    本文实例讲述了Android获取apk签名指纹的md5值以防止重新被打包的实现方法.分享给大家供大家参考,具体如下: 做个记录(这里只是Java层的签名校验,java层容易被破解,我建议apk加固下) 获取md5值来进行Apk签名校验, 可以防止apk重新被打包. 下面我说说怎么获取apk签名的md5值(有三种方法) 1.用代码获取签名指纹的md5值 /** * MD5加密 * @param byteStr 需要加密的内容 * @return 返回 byteStr的md5值 */ public

  • Android签名知识小结

    一.为什么要签名 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换. APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉. 这样签名其实也是开发者的身份标识.交易中抵赖等事情发生时,签名可以防止抵赖的发生. 二.

随机推荐