前言
首先咱们来看看过来几年都产生了哪些因为加密技术使用不当或者未加密而导致的平安危险。
KRACK 攻打
工夫:2017 年 10 月
形容:KRACK 攻打利用 Wi-Fi 加密规范 WPA2 的破绽,容许攻击者窃取 Wi-Fi 网络中的敏感信息,如明码和其余私人数据。
参考文章链接:https://www.krackattacks.com/
破绽修复文章链接:https://www.zdnet.com/article/krack-attack-patches-heres-where-the-bugs-are-lurking/
WhatsApp 近程执行代码破绽
工夫:2019 年 5 月
形容:WhatsApp 存在近程执行代码破绽,攻击者能够通过向受害者发送一个特制的视频文件,来在其设施上执行任意代码。这个破绽影响了大概 1.5 亿用户。
参考文章链接:https://thehackernews.com/2019/05/hacking-whatsapp-account.html
破绽修复文章链接:https://www.whatsapp.com/security/advisories/2019-07-15
Zoom 加密破绽
工夫:2020 年 4 月
形容:视频会议利用 Zoom 存在加密破绽,攻击者能够轻松地窃取会议中的敏感信息。这个破绽被宽泛利用,引起了宽泛的关注和担心。
参考文章链接:https://thehackernews.com/2020/04/zoom-cybersecurity-hacking.html
破绽修复文章链接:https://blog.zoom.us/wordpress/2020/04/09/zoom-rolling-out-security-enhancements-to-address-concerns/
COVID-19 疫情相干的网络攻击
工夫:2020 年
形容:COVID-19 疫情相干的网络攻击是一系列利用新冠病毒疫情来进行网络攻击的办法。这些攻打包含钓鱼邮件、恶意软件、虚伪网站等,旨在窃取用户的个人信息、金融信息等。
参考文章链接:https://www.zdnet.com/article/coronavirus-themed-attacks-now-the-crowd-favorite-among-cybercriminals/
Freak 破绽
工夫:2020 年 3 月
形容:Freak 破绽是一种利用加密算法中的破绽来进行攻打的办法。该破绽容许攻击者破解 TLS/SSL 连贯中的加密,从而窃取传输的敏感信息。
参考文章链接:https://freakattack.com/
破绽修复文章链接:https://www.us-cert.gov/ncas/alerts/TA15-086A
那么咱们如何在挪动利用程序开发过程中正确应用加密技术呢?
明码的作用
明码技术是保障网络与信息安全最无效、最牢靠、最经济的伎俩,在信息安全方面施展着重要作用,保障了信息的机密性、真实性、数据完整性和行为的不可否认性。
保障信息的机密性
信息的机密性是网络与信息安全的次要属性之一,是指确保信息不会泄露给未经受权的集体、计算机和其余实体的性质。
信息是网络空间中最有价值的资产信息,一旦泄露就可能会给国家、社会、行业、个人、集体带来微小的危害和影响。
事实世界中,要保障信息的机密性,如将一份文件机密保留或传递,个别可采纳加装爱护设施、减少警卫人员、隐匿或假装等伎俩。而这些伎俩操作不便捷的同时,须要投入的人力物力大,人为危险因素多。
信息化时代,纸质文件、材料、书籍等信息被编码为计算机电子文件后,尽管大大提高了文件解决、传输和存储的能力,但为保障信息的机密性带来新的挑战。如电子文件被拷贝、截取和流传等诸多行为难以觉察。
密码学中的加密爱护技术保障了信息的机密性。应用实现加密的计算机程序对电子文件加密生成形态乱码的密文,有了足够弱小的加密算法防护,即便攻击者拦挡到密文,也无奈从密文中获取有用的信息。而领有密钥的人则能够应用实现解密的计算机程序从乱码中复原原始文件,获取正确信息。
信息安全中的访问控制技术采纳口令技术避免非法用户进入某个利用零碎的数据库,在肯定水平上保障了信息的机密性。但这一技术仅相当于在数据库门口减少了“门卫”而数据自身依然是明文状态,一旦攻击者绕过“门卫”或“门卫”生效,数据库毫无机密性可言。
保障信息的真实性
信息的真实性也是网络与信息安全的次要属性之一,是指保障信息起源牢靠、没有被伪造和篡改的性质。
如何鉴别信息的合法性?如何确认实在的身份信息?这些都是网络与信息安全畛域十分重要的工作。它们间接影响着社会秩序、生产生存秩序的各个方面。
现实生活中,能够通过面貌、声音、体态等体貌特征来确认人的身份,通过盖章、签字、手印等措施保障消息来源的可靠性。
信息化时代,在凋谢的网络环境下,身份信息和消息来源能够被伪造,电子信息和文件会被拷贝、截获和重用。
密码学中的平安认证技术解决了信息的真实性等问题。平安认证技术包含数字签名、音讯认证码、身份认证协定等,根本思维是: 非法用户领有各自的“机密信息”,可应用“机密信息”解决公共信息并取得相应的“印章”用于证实公共信息的真实性。没有相应“机密信息”的非法用户不能伪造“印章”。
其余可保障真实性的技术,如生物特色技术利用指纹、虹膜等进行身份认证,但它们如果不联合明码技术用于近程认证将十分不平安。
保证数据的完整性
数据完整性是网络与信息安全的又一个重要属性,示意数据是不是未经受权篡改或毁坏的性质。
信息化时代带来了前所未有数据量、信息量、文件量等,各行各业都有大量公开流传和存储的数据,保证数据在传输、存储过程中不被篡改的任务艰巨,特地是在保护大量资料库、文件库时,更为艰巨。
现实生活中,可采纳签名、盖章等伎俩保障数据完整性。
信息化时代,电子文档可采纳水印技术,爱护文件不被篡改,但电子文档完整性不易检测,被批改后很难发现。
对于大量的电子文件爱护工作,哈希算法能够轻松实现数据完整性,通过称为摘要的数学过程,计算从文件中惟一的标识文件的特色信息。只有像这样的简短摘要附加到电子文件,就能够验证文件的完整性。要查看文件是否已被批改,只需应用哈希算法计算新摘要,将这个新的摘要与原来附带的摘要进行比对如果两个摘要一样,反之则证实已被批改。
保障行为的不可否认性
不可否认性同样是网络与信息安全的重要属性。
现实生活中产生的行为会留下证据或“集群”作为不可否认的证据。如在签订合同时,一方回绝签订合同,那么他的签名就能够作为其回绝行为不可否认性的证据。
信息化时代,如何避免曾经在网络上验证的电子合同、电子报表等的不可否认是实现网络与信息安全的重要工作之一。
数字签名技术基于公钥的加密算法能够无效地解决行为的不可否认问题。一旦用户签订了数字签名就不能回绝或回绝他们。对解决网络上的纠纷、电子商务的纠纷等问题数字签名是必不可少的工具。尽管计算机、网络和信息系统的日志能在肯定水平上证实用户的操作行为,但因为日志容易被伪造和篡改,因而无奈保障行为的不可否认性。
加密算法使用不当导致的平安危险
1、不平安的存储:挪动客户端可能会将敏感数据(如明码和用户凭证)存储在明文或不平安的格局中,如明文文本文件或不加密的数据库中。
2、加密算法使用不当:加密算法的实现可能存在安全漏洞,如应用弱加密算法或未正确配置加密参数。此外,应用固定的密钥或硬编码密钥也可能导致安全漏洞。
3、未应用 HTTPS:未应用 HTTPS 协定将挪动应用程序与服务器之间的通信进行加密,可能会使敏感数据在传输过程中裸露给攻击者。
4、未正确验证证书:客户端应用程序可能会受到中间人攻打,这些攻击者可能会在通信链路上坑骗应用程序,以获取敏感数据。要解决此问题,应用程序须要正确验证服务器证书。
5、反向工程攻打:攻击者可能会对应用程序进行反向工程,以发现应用程序中存在的破绽,并利用它们对应用程序进行攻打。
6、未更新的软件:挪动客户端可能会运行过期的软件版本,这些版本可能蕴含已知的安全漏洞和弱点,攻击者能够利用这些破绽进行攻打。
7、不平安的身份验证:应用不平安的身份验证形式,如明文传输明码或应用简略的身份验证办法(如基于 cookie 的身份验证),可能会导致攻击者轻松窃取用户凭证。
8、不良的代码实际:在代码实现过程中,可能存在逻辑谬误和安全漏洞,例如缓冲区溢出、SQL 注入、跨站脚本等。
9、未对用户数据进行适合的革除:应用程序可能会将敏感数据留存在本地设施上,例如用户凭证或私密聊天记录,这可能会导致安全隐患。
10、恶意软件攻打:恶意软件可能会通过植入挪动应用程序中的恶意代码或通过攻击者领有的歹意应用程序来攻打挪动客户端,以获取敏感数据或管制设施。
通信中安全性威逼
个别的,咱们在网络中传输的数据,都能够认为是存在这潜在的危险的。用一句话来概括就是:“任何在网络中传输的明文数据都存在安全性威逼。”
上面就列举下咱们通信中面临的四种威逼:
– 第一,中断 。攻击者无意毁坏和切断别人在网络上的通信,这是对可用性的攻打。
– 第二,截获 。属于被动攻打,攻击者从网络上窃听别人的通信内容,毁坏信息的机密性。
– 第三,篡改 。攻击者成心篡改网络上传送的报文,这是对完整性的攻打。
– 第四,伪造。攻击者伪造信息在网络传送,这是对真实性的攻打。
密钥硬编码危险案例
Android
public static String encrypt(String data){
try {SecretKeySpec secretKeySpec = new SecretKeySpec("49u5gh249gh24985ghf429gh4ch8f23f".getBytes(),"AES");
Cipher instance = Cipher.getInstance("AES");
instance.init(1, secretKeySpec);
return Base64.encodeToString(instance.doFinal(data.getBytes()),0);
catch(Exception e){return "";
iOS
import Foundation
import CommonCrypto
fileprivate let aesKey = "gEKC8gte1FvR3oJV"
fileprivate let iv = "MF00KFtxfibUyDWo"
class Crypto {private static let aesInstance = AESCrypto(key: aesKey, iv: iv)
private init(){}
static func encrypt(_ string: String) -> String {return aesInstance.encrypt(string: string).base64EncodedString()}
static func decrypt(_ data: String) -> String {return aesInstance.decrypt(data: Data(base64Encoded:data)!)
}
}
fileprivate class AESCrypto {
private let key: Data
private let iv: Data
init(key: String,iv:String){guard kevcount=kccKeySizeAEs128. let kevData = kev.datalusina: .utf8) else {preconditionFailure("Error: Failed to set a key")
guard iv.count = kcCBlockSizeAES128,let ivData = iv.data(using: .utf8) else {preconditionFailure("Error: Failed to set an initial vector")
}
self.key = kevData
self.iv = ivData
}
func encrypt(string: String) -> Data {}
let status = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withunsafeBytes { ivBytes in
key.withunsafeBytes { keyBytes in
CCCrypt(option,CCAlgorithm(kCCAlgorithmAES),options,keyBytes.baseAddress, keyLength, ivBytes.baseAddress
}
}
}
Android SDK 提供的加密相干 API
Android SDK 应用的 API 和 JAVA 提供的根本类似,由以下局部组成:
- Java Cryptography Architecture:JCA,java 加密体系结构;
- Java Cryptography Extension:JCE,Java 加密扩大包);
- Java Secure Sockets Extension:JSSE,Java 安全套接字扩大包;
- Java Authentication and Authentication Service:JAAS,Java 甄别与平安服务。
JCA 提供根本的加密框架,如证书、数字签名、音讯摘要和密钥对产生器,对应的 Android API 中的以下几个包:
java.security
java.security.acl
java.security.cert
java.security.interfaces
java.security.spec
JCE 扩大了 JCA,提供了各种加密算法、摘要算法、密钥治理等性能,对应的 Android API 中的以下几个包:
javax.crypto
javax.crypto.interfaces
javax.crypto.spec
JSSE 提供了 SSL(基于安全套接层)的加密性能,应用 HTTPS 加密传输应用,对应的 Android API 次要是 java.net.ssl 包中。
JAAS 提供了在 Java 平台上进行用户身份甄别的性能。对应的 Android API 次要在以下几个包:
javax.security.auth
javax.security.auth.login
javax.security.auth.callback
javax.security.auth.x500
它们其实只是一组接口,理论的算法是可由不同的 Provider 提供,Android API 默认的 Provider 次要是是 Bouncy Castle 和 OpenSSL。此外 Android API 还提供了 android.security 和 android.security.keystore(API 23 新增)来治理 keychain 和 keystore。
罕用算法之:Base64 编码
Base64 编码算法是一种用 64 个字符(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)来示意任意二进制数据的办法。在计算机网络倒退的晚期,因为“历史起因”,电子邮件不反对非 ASCII 码字符,如果要传送的电子邮件带有非 ASCII 码字符(诸如中文)或者图片,用户收到的电子邮件将会是一堆乱码,因而创造了 Base64 编码算法。至于为何会乱码?请大家自行 Google。在加解密算法中,原始的数据和加密后的数据个别也是二进制数据,为了不传输出错,不便保留或者调试代码,个别须要对加密后的数据进行 base64 编码。
Android 提供了 Base64 编码的工具类 android.util.Base64,能够间接应用,不必本人去实现 base64 编码的算法了。如:
byte[] output = sha.digest();
String result = Base64.encodeToString(output, Base64.DEFAULT);
开发者倡议
base64 只是一种编码方式,并不是一种加密算法,不要应用 base64 来加密数据。
罕用算法之:随机数生成器
在 Android 加密算法中须要随机数时要应用 SecureRandom 来获取随机数。如:
SecureRandom sr = new SecureRandom();
byte[] output = new byte[16];
sr.nextBytes(output);
留神不要给 SecureRandom 设置种子。调用 seeded constructor 或者 setSeed(byte[])是不平安的。SecureRandom()默认应用的是 dev/urandom 作为种子产生器,这个种子是不可预测的。
开发者倡议
- 不要应用 Random 类来获取随机数。
- 在应用 SecureRandom 时候,不要设置种子。应用以下函数设置种子都是有危险的:
SecureRandom.SecureRandom(byte[] seed)
SecureRandom.setSeed(long seed)
SecureRandom.setSeed(byte[] seed)
罕用算法之:Hash 算法
Hash 算法是指任意长度的字符串输出,此算法能给出固定 n 比特的字符串输入,输入的字符串个别称为 Hash 值。
特点
- 抗碰撞性:寻找两个不同输出失去雷同的输入值在计算上是不可行的,须要大量的工夫去寻找到具备雷同输入的两个输出字符串。
- 不可逆:不可从后果推导出它的初始状态。
抗碰撞性使得 Hash 算法对原始输出的任意一点更改,都会导致产生不同的 Hash 值,因而 Hash 算法能够用来测验数据的完整性。咱们常常见到在一些网站下载某个文件时,网站还提供了此文件的 hash 值,以供咱们下载文件后测验文件是否被篡改。不可逆的个性使 Hash 算法成为一种单向明码体制,只能加密不能解密,能够用来加密用户的登录明码等凭证。
开发者倡议
1、倡议应用 SHA-256、SHA- 3 算法:
如应用 SHA-256 算法对 message 字符串做哈希:
byte[] input = message.getBytes();
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(input);
byte[] output = sha.digest();
String result = Base64.encodeToString(output, Base64.DEFFAULT);
2、不倡议应用 MD2、MD4、MD5、SHA-1、RIPEMD 算法来加密用户明码等敏感信息:
这一类算法曾经有很多破解方法,例如 md5 算法,网上有很多查问的字典库,给出 md5 值,能够查到加密前的数据。
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md.digest(str.getBytes());
String result = Base64.encodeToString(md5Bytes,Base64.DEFAULT);
3、不要应用哈希函数做为对称加密算法的签名。
4、留神:当多个字符串串接后再做 hash,要十分当心:
如:字符串 S,字符串 T,串接做 hash,记为 H (S||T)。然而有可能产生以下状况。如“builtin||securely”和“built||insecurely”的 hash 值是齐全一样的。如何批改从而防止上述问题产生?改为 H(length(S) || S || T)或者 H(H(S)||H(T))或者 H(H(S)||T)。
理论开发过程中常常会对 url 的各个参数,做词典排序,而后取参数名和值串接后加上某个 SECRET 字符串,计算出 hash 值,作为此 URL 的签名,如 foo=1, bar=2, baz=3 排序后为 bar=2, baz=3, foo=1,做 hash 的字符串为:SECRETbar2baz3foo1,在参数和值之间没有分隔符,则”foo=bar”和”foob=ar”的 hash 值是一样的,”foo=bar&fooble=baz”和”foo=barfooblebaz”一样,这样通过精心结构的歹意参数就有可能与失常参数的 hash 值一样,从而骗过服务器的签名校验。
音讯认证算法
要确保加密的音讯不是他人伪造的,须要提供一个音讯认证码(MAC,Message authentication code)。音讯认证码是带密钥的 hash 函数,基于密钥和 hash 函数。密钥单方当时约定,不能让第三方晓得。
音讯发送者应用 MAC 算法计算出音讯的 MAC 值,追加到音讯前面一起发送给接收者。接收者收到音讯后,用雷同的 MAC 算法计算接管到音讯 MAC 值,并与接管到的 MAC 值比照是否一样。
开发者倡议
倡议应用 HMAC-SHA256 算法,防止应用 CBC-MAC。HMAC-SHA256 例子如下:
// 初始化.KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");
// 产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 获取密钥
byte[] key = secretKey.getEncoded();
Log.d(Base64.encodeToString(key,Base64.DEFAULT));
// 还原密钥
SecretKey restoreSecretKey = new SecretKeySpec(key,"HmacSHA256");
// 实例化 MAC
Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
// 初始化 MAC
mac.init(restoreSecretKey);
// 执行摘要
byte[] hmacSHA256Bytes = mac.doFinal(message.getBytes());
result = Base64.encodeToString(hmacSHA256Bytes,Base64.DEFAULT):
对称加密算法
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起通过非凡加密算法解决后,使其变成简单的加密密文发送进来。收信方收到密文后,若想解读原文,则须要应用加密用过的密钥及雷同算法的逆算法对密文进行解密,能力使其复原成可读明文。在对称加密算法中,应用的密钥只有一个,发收信单方都应用这个密钥对数据进行加密和解密,这就要求解密方当时必须晓得加密密钥。
该算法的毛病是,如果一旦密钥透露,那么加密的内容将都不可信了。
开发者倡议
1、倡议应用 AES 算法。
2、DES 默认的是 56 位的加密密钥,曾经不平安,不倡议应用。
3、留神加密模式不要应用 ECB 模式。ECB 模式不平安,阐明问题的经典的三张图片,如下:
明文是:
用 ECB 加密模式后:
用 CBC 加密模式后:
4、Android 提供的 AES 加密算法 API 默认应用的是 ECB 模式,所以要显式指定加密算法为:CBC 或 CFB 模式,可带上 PKCS5Padding 填充。AES 密钥长度起码是 128 位,举荐应用 256 位。
// 生成 KEY
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
// 产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 获取密钥
byte[] keyBytes = secretKey.getEncoded();
Log.d("AES KEY", Base64.encodeToString(keyBytes,0));
// 还原密钥
SecretKey key = new SecretKeySpec(keyBytes, "AES");
// 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encodeResult = cipher.doFinal(plainText.getBytes());
Log.d("AESencode", Base64.encodeToString(encodeResult, Base64.DEFAULT));
非对称加密
非对称加密算法须要两个密钥:公开密钥(publickey)和公有密钥(privatekey)。公开密钥与公有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的公有密钥能力解密;如果用公有密钥对数据进行加密,那么只有用对应的公开密钥能力解密(这个过程能够做数字签名)。
非对称加密次要应用的是 RSA 算法。
开发者倡议
1、留神密钥长度不要低于 512 位,倡议应用 2048 位的密钥长度。应用 RSA 进行数字签名的算法,如:
// 生成密钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKeyrsaPublicKey=(RSAPublicKey)keyPair.getPublic();
RSAPrivateKeyrsaPrivateKey =(RSAPrivateKey)keyPair.getPrivate()
// 签名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(rsaPrivateKey.getEncoded())
KeyFactory keyFactory = KeyFactory getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(src.getBytes());
byte[] result = signature.sign();
2、应用 RSA 算法做加密,RSA 加密算法应应用 Cipher.getInstance(RSA/ECB/OAEPWithSHA256AndMGF1Padding),否则会存在重放攻打的危险。如:
KeyPairGenerator keyPairGenerator =
KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKeyrsaPublicKey=(RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey=(RSAPrivateKey)keyPair.getPrivate();
// 公钥加密
X509EncodedKeySpec x509EncodedKeySpec = newX509EncodedKeySpec(rsaPublicKey.getEncoded()):
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
byte[] result =cipher.doFinal(src.getBytes());
...
// 私钥解密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory2 = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory2.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] result2 = cipher.doFinal(result);
加密算法 PBE
PBE 是一种基于口令的加密算法,其特点是应用口令代替了密钥,而口令由用户本人主持,采纳随机数杂凑多重加密等办法保证数据的安全性。
开发者倡议:
应用基于口令的加密算法 PBE 时,生成密钥时要加盐,盐的取值最好来自 SecureRandom,并指定迭代次数。如:
// 初始化盐
mSalt = new byte[SALT_LENGTH_BYTES];
SecureRandom sr = new SecureRandom();
sr.nextBytes(mSalt);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(KEY_GENERATOR_MODE);
keySpec = new PBEKeySpec(password, salt, KEY_GEN_ITERATION_COUNT, KEY_LENGTH_BITS);
secretKey = secretKeyFactory.generateSecret(keySpec);
总结
几条准则
1、不要本人设计加密算法和协定,应用业界规范的算法。
2、对称加密算法不要应用 ECB 模式,不倡议应用 DES 算法。
3、要抉择适合长度的密钥。
4、要确保随机数生成器的种子具备足够的信息熵。
5、不要应用没有音讯认证的加密算法加密音讯,无奈防重放。
6、当多个字符串拼接后做 hash,要十分当心。
7、当给算法加盐取值时不要太短,不要反复。
8、应用初始化向量时 IV 时,IV 为常量的 CBC,CFB,GCM 等和 ECB 一样能够重放,即采纳上一个音讯的最初一块密文作为下一个音讯的 IV,是不平安的。
9、密钥应遵循的准则:
- (1)密钥不能为常量,应随机,定期更换,如果加密数据时应用的密钥为常量,则雷同明文加密会失去雷同的密文,很难避免字典攻打。
- (2)开发同学要防备密钥硬编码的问题。
密钥存储安全性从高到低
- 密钥存储在硬件反对的 Android KeyStore 中
- 所有密钥都存储在服务器上,并在强身份验证后可用
- 主密钥存储在服务器上,用于加密存储在 Android SharedPreferences 中的其余密钥
- 密钥存储在 Android KeyStore 的软件实现中
- 主密钥存储在 Android 密钥库的软件实现中,用于加密存储在 SharedPreferences 中的其余密钥
- 所有密钥都存储在 SharedPreferences 中(不倡议)
- 在源代码中硬编码加密密钥(不倡议)
- 基于稳固属性的可预测含糊函数或密钥生成函数(不倡议)
- 将生成的密钥存储在内部存储(如 /sdcard/)(不倡议)
参考文章:
https://blog.oversecured.com/Use-cryptography-in-mobile-apps-…
http://www.52im.net/thread-216-1-1.html
举荐浏览:
挪动利用人脸识别危险与检测
过某加固 Frida 检测
某涉黄 APP 产业链剖析
举荐浏览:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g