标签: secure-element

如何将数据存储到android中的Secure Element中

我想在Android中创建一个像应用程序一样的谷歌钱包.据说"所有支付凭证都存储在称为手机中包含的安全元素的芯片中".如何访问此安全元素并将我的卡凭据存储到其中.我的目的是在收银台而不是我的卡上使用我的手机(Nexus).

所以我想要的是将一些数据存储到安全元件芯片并在我点击NFC读卡器时访问数据.

提前致谢.

android nfc nexus-s secure-element

7
推荐指数
1
解决办法
3162
查看次数

如何检查安全区域是否可用于设备

我们知道安全的Enclave是Apple A7中制造的协处理器,它在A7及更高版本中可用但在iOS 9中公开使用kSecAttrTokenIDSecureEnclave但我们如何检查某些设备是否支持安全区?谢谢

security ios secure-element

6
推荐指数
1
解决办法
1011
查看次数

在 Android 上使用选定的 UID 模拟 NFC 卡

我想问 2 个关于 NFC 卡模拟的问题:

  1. 我可以模拟包含我选择的 uid 的 NFC 卡吗?

  2. 我阅读了HCE,但不明白 HCE 和带有安全元件的卡模拟之间有什么区别?

安全元件有哪些缺点?我无法控制卡数据/uid,但我可以控制 HCE 吗?

android rfid nfc hce secure-element

6
推荐指数
1
解决办法
1万
查看次数

Web 应用程序可以通过移动浏览器使用 Secure Element(或 Enclave)吗?

本机移动应用程序可以使用 Secure Element(或Enclave),例如生成和使用私钥来加密和签名数据。这些私钥存储在移动设备的硬件中,甚至手机制造商也无法访问,从而赋予它们极强的安全性能。

我希望在网络应用程序中具有相同的功能(这将更广泛地使用,因为它不需要安装)。这可能吗?

我在网上搜索过,但没有找到任何关于这方面的好信息。原则上,移动浏览器(因为它们本身就是本机应用程序)似乎可以像任何其他应用程序一样使用安全元素。事实上,作为一个例子,我很确定他们正在使用它来通过WebAuthn启用身份验证,WebAuthn 使用密钥对和存储在设备上的私钥。但是...据我所知,浏览器不会公开对网络应用程序的访问。

任何有关这方面的信息将不胜感激!谢谢

android mobile-browser ios private-key secure-element

6
推荐指数
1
解决办法
967
查看次数

在 API 28(Android Pie) 上支持 Android StrongBox 的 Android 智能手机列表

我需要在 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:无法生成密钥对

security android keystore secure-element

5
推荐指数
2
解决办法
2235
查看次数

在 SSLContext 中使用硬件支持的密钥

我想在 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)

security android keystore sslcontext secure-element

5
推荐指数
1
解决办法
1213
查看次数

如何查看Android上的Open Mobile API版本?

据我了解,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的版本?如果有,我该怎么办?

android version nfc open-mobile-api secure-element

3
推荐指数
1
解决办法
2635
查看次数

OMAPI 支持的设备列表

我正在使用 Open Mobile API 进行开发,但到目前为止还没有找到默认支持该 API 的设备列表(默认情况下使用 OEM ROM)。

我意识到从 API 级别 21 开始,Android 电话支持通过 TelephonyManager 直接通过基本和逻辑通道发送 APDU。但我也想知道运行 API 级别 21 之前的设备。

那么,是否已经编制了具有内置支持的设备列表,或者有没有办法自己找出来?

android apdu nfc open-mobile-api secure-element

3
推荐指数
1
解决办法
2130
查看次数

在Android中访问安全元素

我们如何访问Android手机中的安全元素.基本上我需要存储一些安全数据并检索它,我只希望我的应用程序访问这些数据.请让我知道这些步骤.

android nfc secure-element

1
推荐指数
1
解决办法
4177
查看次数

如何在SEservice中使用Executor(Android 9.0开放移动API)

我正在研究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)

java android nfc open-mobile-api secure-element

1
推荐指数
1
解决办法
1536
查看次数

发送数据、使用 HCE 还是使用安全元件?(Android、Kotlin、Mifare 1k)

我正在尝试实现模拟 Mifare One(1K/S50,ISO14443A)芯片的功能,以便能够使用具有 NFC 功能的手机而不是物理 Mifare 卡,或者如果可能的话,仅将数据发送到读卡器。

我有这种类型的阅读器/写入器:https://www.evelta.com/er302-high-Frequency-nfc-writer-usb/

在浏览了论坛、stackoverflow 问题后,我发现这篇文章是最好的例子:

https://medium.com/the-almanac/how-to-build-a-simple-smart-card-emulator-reader-for-android-7975fae4040f

我实现了 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 有点怀疑。

  • 简单地”将数据发送给阅读器 …

nfc mifare nfc-p2p hce secure-element

1
推荐指数
1
解决办法
2528
查看次数