密钥库系统由 KeyChain API 以及在 Android 4.3(API 级别 18)中引入的 Android 密钥库提供程序功能使用。本文说明了何时以及如何使用 Android 密钥库提供程序。
1、 存储密匙:Android提供的这个KeyStore最大的作用就是不需要开发者去维护这个密匙的存储问题,相比起存储在用户的数据空间或者是外部存储器都更加安全。注意的是这个密匙随着用户清除数据或者卸载应用都会被清除掉。
2、得益于Android独立的一套密匙库系统,可以提高安全性
Android 密钥库系统可以保护密钥材料免遭未经授权的使用。首先,Android 密钥库可以防止从应用进程和 Android 设备中整体提取密钥材料,从而避免了在 Android 设备之外以未经授权的方式使用密钥材料。其次,Android 密钥库可以让应用指定密钥的授权使用方式,并在应用进程之外强制实施这些限制,从而避免了在 Android 设备上以未经授权的方返世式使用密钥材料。
Android 密钥库密钥使用两项安全措施来避免密钥材料被提取:
为了避免在 Android 设备上以未经授权的方式使用密钥材料,在生成或导入密钥时 Android 密钥库会让应用指定密钥的授权使用方式。一旦生成或导入密钥,其授权将无法更改。然后,每次使用密钥时,都会由 Android 密钥库强制执行授权。这是一项高级安全功能,通常仅用于有以下要求的情形:在生成/导入密钥后(而不是之前或当中),应用进程受到攻击不会导致漏慧肢密钥以未经授权的方式使用。
支持的密钥使用授权可归为以下几个类别:
作为一项额外的安全措施,对于密钥材料位于安全硬件内部的密钥(请参阅 KeyInfo.isInsideSecurityHardware()),某些密钥使用授权可能由安全硬件实施,具体取决于 Android 设备。加密和用户身份验证授权可能由安全硬件实施。由于安全硬件一般不具备独立的安全实时时钟,时间有效性间隔授权不可能由其实施。
您可以使用 KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware() 查询密钥的用户身份验证授权是否由安全硬件实施。
在需要系统级凭据时请使用 KeyChain API。在应用通过 KeyChain API 请求使用任何凭据时,用户需要通过系统提供的 UI 选择应用可以访问已安装的哪些凭据。因此,在用户同意的情况下多个应用可以使用同一套凭据。
使用 Android 密钥库提供程序让各个应用存储自己的凭据,并且只允许应用自身访问。这样,应用可以管理仅能由自己使用的凭据,同时又可以提供等同于 KeyChain API 为系统级凭据提供的安全优势。这一方法不需要用户选择凭据。
要使用此功能,请使用标准的 KeyStore 和 KeyPairGenerator 或 KeyGenerator 类,以及在 Android 4.3(API 级别 18)中引入的 AndroidKeyStore 提供程序。
AndroidKeyStore 注册为 KeyStore 类型以用于 KeyStore.getInstance(type) 方法,而在用于 KeyPairGenerator.getInstance(algorithm, provider) 和 KeyGenerator.getInstance(algorithm, provider) 方法时则注册为提供程序。
生成新的 PrivateKey 要求您同时指定自签署证书具备的初始 X.509 属性。之后,您可以使用 KeyStore.setKeyEntry 将证书替换为由证书颁发机构 (CA) 签碧碧署的证书。
要生成密钥,请使用 KeyPairGenerator 和 KeyPairGeneratorSpec:
要生成密钥,请使用 KeyGenerator 和 KeyGenParameterSpec。
AndroidKeyStore 提供程序的使用通过所有的标准 KeyStore API 加以实现。
通过调用 aliases() 方法列出密钥库中的条目:
通过从密钥库提取 KeyStore.Entry 并使用 Signature API(例如 sign())签署数据:
类似地,请使用 verify(byte[]) 方法验证数据:
生成密钥或将密钥导入到 AndroidKeyStore 时,您可以指定密钥仅授权给经过身份验证的用户使用。用户使用安全锁定屏幕凭据(模式/PIN/密码、指纹)的子集进行身份验证。
这是一项高级安全功能,通常仅用于有以下要求的情形:在生成/导入密钥后(而不是之前或当中),应用进程受到攻击不会导致密钥被未经身份验证的用户使用。
如果密钥仅授权给经过身份验证的用户使用,可以将其配置为以下列两种模式之一运行:
下面槐绝是一个进行加密的工具类,加密类会产生一个密钥文件,密钥文件保存到了硬盘文件中,程序中要进行对数据的加解密 *** 作。密钥文件保存在模卜文件,别人也就可以读取密钥文件,获得加密数据的内容。publicclass EncryptUtil { privatestatic String keyPath = nullprivatestatic String getKeyPath() { keyPath = "c:\\yhb.des"return keyPath} /** * 对称加密-产生密钥 */publicstaticvoid generatorKey() { SecretKey key = nulltry { // 指定算法,这里为DES如果想用Blowfish算法,则用getInstance("Blowfish") // BouncyCastle基本上支持所有通用标准算法 KeyGenerator keygen = KeyGenerator.getInstance("DES")// 指定密钥长度,长度越高,加密强度越大 keygen.init(56)// 产生密钥 key = keygen.generateKey()// 构造输出文件,这里的目录是动态的,根据用户名称来构造目录 ObjectOutputStream keyFile = new ObjectOutputStream( new FileOutputStream(getKeyPath()))keyFile.writeObject(key)keyFile.close()} catch (NoSuchAlgorithmException e5) { e5.printStackTrace()System.exit(0)} catch (IOException e4) { e4.printStackTrace()System.exit(0)} } /** * 对称加密-读取密钥. */privatestatic SecretKey getSecretKey() { // 从密钥文件中读密钥 SecretKey key = nulltry { ObjectInputStream keyFile = new ObjectInputStream( new FileInputStream(getKeyPath()))key = (SecretKey) keyFile.readObject()keyFile.close()} catch (FileNotFoundException ey1) { e1.printStackTrace()System.exit(0)} catch (Exception ey2) { e2.printStackTrace()} return key} /** * 加密文本信息. */publicstatic String encrypt(String encryptStr) { SecretKey key = getSecretKey()Cipher cipher = nulltry { // 设置算法,应该与加密时的设置一样 cipher = Cipher.getInstance("DES")// 设置解密模式 cipher.init(Cipher.ENCRYPT_MODE, key)} catch (Exception ey3) { ey3.printStackTrace()} byte[] data = nulltry { data = cipher.doFinal(encryptStr.getBytes())} catch (IllegalBlockSizeException e) { e.printStackTrace()} catch (BadPaddingException e) { e.printStackTrace()} encryptStr = Base64.encodeBase64String(data)return encryptStr} /** * 解旦明穗密文本信息. */publicstatic String decrypt(String decryptStr) { SecretKey key = getSecretKey()// 用key产生Cipher Cipher cipher = nulltry { // 设置算法,应该与加密时的设置一样 cipher = Cipher.getInstance("DES")// 设置解密模式 cipher.init(Cipher.DECRYPT_MODE, key)} catch (Exception ey3) { ey3.printStackTrace()System.exit(0)} byte[] data = Base64.decodeBase64(decryptStr)try { data = cipher.doFinal(data)} catch (IllegalBlockSizeException e) { e.printStackTrace()} catch (BadPaddingException e) { e.printStackTrace()} decryptStr = new String(data)return decryptStr} }首先:密钥尘如直接明文写在代码里是肯定不可取的!将密钥保存在文件中,如果是服务器端的话,没什么大问题,你也可以直接将密钥写在代码里。
不存储密钥,使用随机密钥,每次加密的时候的密钥都不一样,需要考虑的就是解密时怎么取到生成的密钥。可以加一些数据来生成密钥,比如用派仔启户名、用户密码什么的。4.使用系统提供的密钥容器,进行存储密钥,现在 *** 作系统这么多,存储容器的使用就自己去查看相关 *** 作系统的文档吧。
可以使用电子证书,当然证书你可以存储在 *** 作系统的密钥容器上,或者其它介质中,看你的需要咯。
加强密钥,就是使用多种加密算法,把戚蠢数据多加密几次,把密钥也加密了。这样的话就是涉及到加密密钥的密钥要存储在哪。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)