我想在Android中创建一个像应用程序一样的谷歌钱包.据说"所有支付凭证都存储在称为手机中包含的安全元素的芯片中".如何访问此安全元素并将我的卡凭据存储到其中.我的目的是在收银台而不是我的卡上使用我的手机(Nexus).
所以我想要的是将一些数据存储到安全元件芯片并在我点击NFC读卡器时访问数据.
提前致谢.
我们知道安全的Enclave是Apple A7中制造的协处理器,它在A7及更高版本中可用但在iOS 9中公开使用kSecAttrTokenIDSecureEnclave但我们如何检查某些设备是否支持安全区?谢谢
我想问 2 个关于 NFC 卡模拟的问题:
我可以模拟包含我选择的 uid 的 NFC 卡吗?
我阅读了HCE,但不明白 HCE 和带有安全元件的卡模拟之间有什么区别?
安全元件有哪些缺点?我无法控制卡数据/uid,但我可以控制 HCE 吗?
本机移动应用程序可以使用 Secure Element(或Enclave),例如生成和使用私钥来加密和签名数据。这些私钥存储在移动设备的硬件中,甚至手机制造商也无法访问,从而赋予它们极强的安全性能。
我希望在网络应用程序中具有相同的功能(这将更广泛地使用,因为它不需要安装)。这可能吗?
我在网上搜索过,但没有找到任何关于这方面的好信息。原则上,移动浏览器(因为它们本身就是本机应用程序)似乎可以像任何其他应用程序一样使用安全元素。事实上,作为一个例子,我很确定他们正在使用它来通过WebAuthn启用身份验证,WebAuthn 使用密钥对和存储在设备上的私钥。但是...据我所知,浏览器不会公开对网络应用程序的访问。
任何有关这方面的信息将不胜感激!谢谢
我需要在 Android 9 中支持安全元素和 StrongBox 的 Android 手机列表。我在哪里或如何找到它?
我用三星 Galaxy S9 和 AVD Google Pixle XL API 28 尝试了下面的代码
KeyPairGenerator kpg = null;
kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder("keystore1", KeyProperties.PURPOSE_SIGN)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.setCertificateSubject(new X500Principal("CN=MyCompany"))
.setIsStrongBoxBacked(true) /* Enable StrongBox */
.setInvalidatedByBiometricEnrollment(true)
.build());
KeyPair kp = kpg.generateKeyPair();
KeyFactory factory = KeyFactory.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(kp.getPrivate(), KeyInfo.class);
keyInfo.isInsideSecureHardware();
Run Code Online (Sandbox Code Playgroud)
它抛出以下异常:
android.security.keystore.StrongBoxUnavailableException:无法生成密钥对
我想在 Android 上使用硬件支持的密钥进行客户端双向 TLS。钥匙应该通过生物识别技术解锁。
我找到了如何在 Android 上生成硬件支持的密钥对:
KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyGenerator.initialize(
new KeyGenParameterSpec.Builder(myAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.setUserAuthenticationRequired(true)
.build());
keyGenerator.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
以及如何使用指纹解锁硬件支持的私钥:
FingerprintManager fingerprintManager = (FingerprintManager) this.getSystemService(Context.FINGERPRINT_SERVICE);
PrivateKey key = (PrivateKey) keyStore.getKey(myAlias, null);
Cipher cipher = Cipher.getInstance(cipherAlgorithm, "AndroidKeyStore");
cipher.init(Cipher.DECRYPT_MODE, key);
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, authenticationCallback, null);
Run Code Online (Sandbox Code Playgroud)
我还可以将 HttpClient 配置为使用客户端证书:
// I have loaded the PrivateKey privateKey and Certificate certificate from PEM files
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(null);
final char pseudoSecretPassword[] = ("##" …Run Code Online (Sandbox Code Playgroud) 据我了解,Open Mobile API与制造商创建的Android ROM捆绑在一起.我们正在使用大量使用Open Mobile API的SDK,并发现一些供应商创建了ROM,其中Open Mobile API的版本与Android版本不兼容.这会导致灾难,当我们尝试使用上述SDK时,应用程序崩溃.因为SDK启动了一个新线程,并在其上崩溃.我们甚至无法将整个逻辑放在try-catch块中,因为所有这些都在一个单独的线程中运行.
我们决定检查Android和Open Mobile API的版本,看看它们是否不兼容,如果是,则完全禁用需要它的功能.
有没有办法确定预装的Open Mobile API的版本?如果有,我该怎么办?
我正在使用 Open Mobile API 进行开发,但到目前为止还没有找到默认支持该 API 的设备列表(默认情况下使用 OEM ROM)。
我意识到从 API 级别 21 开始,Android 电话支持通过 TelephonyManager 直接通过基本和逻辑通道发送 APDU。但我也想知道运行 API 级别 21 之前的设备。
那么,是否已经编制了具有内置支持的设备列表,或者有没有办法自己找出来?
我们如何访问Android手机中的安全元素.基本上我需要存储一些安全数据并检索它,我只希望我的应用程序访问这些数据.请让我知道这些步骤.
我正在研究NFC,目前尝试为Android 9.0内置的Open Mobile API编写代码,但不明白在SEService中传递Executor参数的方式。
public class MainActivity extends Activity implements SEService.OnConnectedListener {
final String LOG_TAG = "NfcTest";
private SEService seService;
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
button = new Button(this);
button.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
button.setText("Click Me");
button.setEnabled(false);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
Reader[] readers = seService.getReaders();
if (readers.length < 1)
return;
Session session = readers[0].openSession();
Channel channel = session.openLogicalChannel(new byte[]{
(byte) 0xF0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现模拟 Mifare One(1K/S50,ISO14443A)芯片的功能,以便能够使用具有 NFC 功能的手机而不是物理 Mifare 卡,或者如果可能的话,仅将数据发送到读卡器。
我有这种类型的阅读器/写入器:https://www.evelta.com/er302-high-Frequency-nfc-writer-usb/
在浏览了论坛、stackoverflow 问题后,我发现这篇文章是最好的例子:
我实现了 HCE 部分,运行程序,读者相信我的手机是 Mifare 芯片,到目前为止一切顺利。
我的问题:
无论我尝试使用什么“标准”身份验证密钥......它都会给我身份验证错误。我阅读了有关 Auth: Authentication failure for Mifare 1K NFC tag using ACR122U NFC reader 的问题,它适用于物理 Mifare 卡...但我不知道如何设置或了解模拟卡的密钥。
我不明白为什么这个例子模拟了确切的 Mifare 芯片类型……即使断点在 APDUService 中也不起作用,但读者会以某种方式检测到便宜的 Mifare。
阅读完相关内容后,我发现我无法 100% 模拟物理卡,因此我必须以某种方式通过服务发送 APDU 响应中我想要的所有数据(我相信这是收发部分)。
但我什至无法验证。
我尝试寻找其他可能的解决方案:
AndroidBeam:Android - Android p2p...听起来很简单,相对高级的 API,但它已被弃用,而且不能保证读者甚至会使用 Android...它可能是一个“简单”的 USB 读卡器硬件,例如我用。
SecureElement:具有讽刺意味的是......它似乎是最推荐的,我读到“是的,mifare 是可能的”之类的东西,但我找不到它的一个很好的例子,而且官方的 Google 文档也没有任何好的例子。我读到它适用于“ISO/IEC 7816-4”,但 Mifare 1K 是 ISO14443A,所以我对此 API 有点怀疑。
“简单地”将数据发送给阅读器 …