admin管理员组文章数量:1794759
Android中的加密
目录,本文主要分为两部分:
1.使用AES算法进行加密2.使用RSA算法进行加密在使用Encryption之前最好学习一些东西:算法类型(非对称和对称)模式和填充按键类型Java密码体系结构Android Key Stsubhdore1、安卓中的AES加密
AES是一种众所周知且最推荐的标准加密算法,该算法使用替换置换网络通过对称密钥对纯数据进行加密。
对称密钥是由基于密码的密钥派生功能(PBKDF2)生成的是获取密码并用salt对其进行哈希处理多次,以确保生成唯一的密钥,即使不同的用户使用相同的密码也是如此。死海古卷该密钥还可以使用Android Keystore和Galois / Counter Mode(GCM)用作阻止模式来生成。AES支持128、192和256位的密钥长度。
AES仅将128位数据作为一个块进行加密,要对整个消进行加密,我们必须选择一种块模式,例如电子密码簿(ECB)或密码块链接(CBC),计数器模式(CTR),其中可以对多个块进行加密到单个密文。
ECB在每个块上使用相同的未更改密钥进行加密CBC使用先前生成的密码对新块进行加密,并对第一个块使用Initialization VectorCTR将块密码转换为流密码,这意味着无需填充
AES加密将在API 23+以上卢巧音提供
带有GCM块模式的AES加密在这种方法中,将使用密码生成一个初始向量,随后将用于解密数据,该方法中不需要加salt。
创建密钥库:
val keyStore = 阿斯塔纳KeyStore.getInstance(ANDROID_KEYSTORE)keyStore.load(null)创配对t检验建对称密钥:
VAL的KeyGenerator = 的KeyGenerator .getInstance(KeyProperties。KEY_ALGORITHM_AES,ANDROID_KEYSTORE)val keyGenParameterSpec = KeyGenParameterSpec.闻屁师Builder( KEY_ALIAS, 关键属性。PURPOSE_ENCRYPT 或 KeyPro强力家具perties。PURPOSE_DECRYPT) .setBlockModes(KeyProperties。BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties。ENCRYPTION_PADDING_NONE) // .setUserAuthenticationRequired(true)//需要锁定屏幕,如果禁用了锁定屏幕则无效 // .setUserAuthenticationValidityDurationSeconds(120)//仅在密码验证后的x秒内可用。 阿连德.setRandomizedEncryptionRequired(true)//每次调用时相同明文的4种不同密文 。建立()keyGenerator。初始化(keyGenParameterSpec)val secretkey = keyGenerator.generateKey()setUserAuthenticationRequired()对于加密和解密所需的身份验证为true,这可能取决于移动提供商,有时会导致崩溃应用
然后我们需要检查秘钥是否已经存在了,当然这是可选的:
fun isKeyjavaeyeExists(keyStore : KeyStore): Boolean { val aliases = keyStore.aliases() while (aliases.hasMoreElements()) { return (KEY_ALIAS == aliases.nextElement()) motogp直播} return false}使用AES加密数据:
fun encryptData(data: ByteArray): HashMap<String, ByteArray> { val cipher = Cipher.getInstance("AES/GCM/NoPadding") cipher.init(Cipher.ENCRYPT_MODE, getSymmetricKey()) val eiv = (Base64.encodeToString(cipher.iv,Base64.NO_WRAP)).toByteArray() val edata = (Base64.encodeToString(cipher.doFinal(data),Base64.NO_WRAP)).toByteArray() return hashMapOf(Pair(IV_VALUE,eiv),Pair(ENC_VALUE,edata))}密码实例转换格式应为算法/模式/填充,加密数据和IV将以字节数组格式生成。将其转换为Base64只是增加了一层安全性,并且是完全可选的
解密数据:
fun decryptNoBase(ivBytes : ByteArray,encryptedBytes : ByteArray): String { val cipher = Cipher.getInstance("AES/GCM/NoPadding") cipher.init(Cipher.DECRYPT_MODE, getSymmetricKey(), GCMParameterSpec(128, ivBytes))安徽seo val decryptedData = cipher.doFinal(encryptedBytes).fromBytetoString() return decryptedData}具有CBC块模式的AES加密在这种方法中,将需要使用密码美丽人生影评 charArray来加密和解密数据:
加密:
fun encrypt(datatoEncrypt: ByteArray): HashMap<String, ByteArray> { val salt = ByteArray(256) SecureRandom().nextBytes(salt) val iv = ByteArray(16) SecureRandom().n地方税税率extBytes(iv) val iterationCount = 1324 val keyLength = 256 val pbKeySpec = PBEKeySpec(ENCRYPT_PASSWORD.toCharArray(), salt, iterationCount, keyLength) val keyBytes = SecretKeyFactory.getInstance("PBKDF2With均衡教派HmacSHA1&认真的赵先森#34;).generateSecret(pbKeySpec).encoded val secKey = SecretKeySpec(keyBytes, KeyProperties.KEY_ALGORITHM_AES) val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding") cipher.init(Cipher.ENCRYPT_MODE, secKey , IvParameterSpec(iv)) return hashMapOf(Pair(SALT_VALUE,salt),Pair(IV_VALUE,iv),Pair(ENC_VALUE,cipher.doFinal(datatoEncrypt)))}解密数据,使用异常处理和断点需要与加密数据时生成的盐和IV相同的盐和IV,以更好地了解执行流程和异常(如果引发)
2、使用RSA加密
一种非对称密码算法,基本上使用两个不同的密钥来加密和解密数据。公钥用于加密,而私钥用于解密
RSA从API级别10+开始,但是不建议使用,大多数填充都在API级别18+上运行,与对称加密相比,加密过程有点慢。
先创建秘钥对:
fun createAsymmetricKeyPair(): KeyPair { val generator: KeyPairGenerator if (hasMarshmallow()) { generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_KEYSTORE) val builder = KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_ECB) //.setUserAuthenticationRe预测地震quired(true) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) generator.i黑白格nitialize(builder.build()) } else { generator = KeyPairGenerator.getInstance("RSA") generator.i步兵炮nitialize(2048) } return generator.generateKeyPair(美国竞选)}加密解密数据:
fun encrypt(data: String, publicKey: Key?): String { val cipher: Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.ENCRYPT_MODE, publicKey) val bytes = cipher.doFinal(data.toByteArray()) return Base64.encodeToString(bytes, Base6增大音量4.DEFAULT)}fun decrypt(data: String, privateKey: Key?): String { val cipher: Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.DECRYPT_MODE, privateKey) val encryptedData = Base64.decode(data, Base64.DEFAULT) val decodedData = cipher.doFinal(encryptedData) return String(decodedData)}本文标签: android
版权声明:本文标题:Android中的加密 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686624957a87755.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论