3

我们必须使用金雅拓 IDPrime .Net 卡智能卡。我们得到这些 USB 加密狗并且必须更改 PIN。

金雅拓通过窗户说:

From the Start menu, choose Run and type PINTool.
Insert a IDPrime .Net card in the reader as prompted, and click OK. The change PIN interface appears
Enter the old PIN (the default PIN value is 0000), the new PIN and confirm the new PIN.
Click on Change Pin

http://support.gemalto.com/index.php?id=how_to_change_pin_in_a_idprime#.VWYTWUa8rV8

这可行,但我想通过 powershell 或 c# 设置一个新的 PIN/密码,即在程序的控制下。怎么做或者是不可能的?

4

2 回答 2

3

您应该能够通过非托管的 PKCS#11 API 更改 PIN,该 API 可以使用名为Pkcs11Interop的托管 .NET 包装器从 C# 轻松访问,我是该 API 的作者。

以下是可以帮助您入门的代码示例:

using Net.Pkcs11Interop.Common;
using Net.Pkcs11Interop.HighLevelAPI;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // Load PKCS#11 library provided by Gemalto
            using (Pkcs11 pkcs11 = new Pkcs11("gtop11dotnet.dll", true))
            {
                // Find first slot/reader with token/card present
                Slot slot = pkcs11.GetSlotList(true)[0];

                // Open RW session
                using (Session session = slot.OpenSession(false))
                {
                    // Login as normal user with current PIN
                    session.Login(CKU.CKU_USER, "0000");

                    // Set the new pin for the logged in user
                    session.SetPin("0000", "1111");

                    session.Logout();
                }
            }
        }
    }
}
于 2015-05-27T21:11:29.963 回答
0

使用为 C# 发布的答案@jariq,我能够获得以下内容来PowerShell更改Admin PIN.

注意:这专门针对正在被 IDPrime MD 产品线取代的金雅拓 IDPrime .NET 卡。有关更多信息,请参阅这篇文章的结尾。

# www.pkcs11interop.net
Add-Type -Path "C:\Somepath\Pkcs11Interop.4.0.0\lib\net45\Pkcs11Interop.dll"

# Gemalto PKCS11 driver
# 1 = single threaded
$pkcs11 = New-Object Net.Pkcs11Interop.HighLevelAPI.Pkcs11("C:\somepath\gtop11dotnet64.dll",1)

# 0 = SlotsType.WithTokenPresent
$slots = $pkcs11.GetSlotList(0)

$slot = $slots[0] # often its the first

# create session
# 1 = SessionType.ReadWrite
$session = $slot.OpenSession(1)

[byte[]]$defaultPIN = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

# 000000000000000000000001
[byte[]]$newPIN = 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31

# 0 = Security Officer a.k.a. Admin
$session.Login(0, $defaultPIN)

$session.SetPin($defaultPIN, $newPIN)

$session.Dispose()
$slot.CloseAllSessions()
$pkcs11.Dispose()

我发现将每个转换PIN为字节数组以用于登录和更改PIN. 要将 48 位 Admin PIN 转换为 24 字节,创建了以下函数。

Function Convert-AdminPinToByteArray([Validatepattern("^[0-9A-F]{48}$")][string]$AdminPIN)
{
    $ReturnByte = New-Object byte[] 24

    $n = 0

    for($i=0;$i -lt $ReturnByte.Length;$i++)
    {
        $ReturnByte[$i] = [byte]"0x$($AdminPIN.SubString($n,2))"
        $n = $n + 2
    }

    return $ReturnByte

} # End Function Convert-AdminPinToByteArray

金雅拓卡类型

上述示例基于即将退役的金雅拓 IDPrime .NET卡。销售结束 (EOS) 公告在这里。

IDPrime .Net
IDPrime .Net 生物

关键日期:
里程碑日期
最后一次购买 (LTB) 2017 年 9 月 29 日
终止销售 (EOS) 2017 年 9 月 30 日
2018 年 9 月 30 日停产 (EOL)

替换

根据 EOS 公告 PDF

产品 金雅拓的 IDPrime .NET 510/511 智能卡系列将被IDPrime MD 83xIDPrime MD 84x系列智能卡所取代。

对替换卡进行编程

我已包含有关区分卡类型的信息,因为我有一个用于测试的金雅拓 IDPrime MD 830,而上述技术不起作用。事实上,使用上述技术,卡片甚至不会显示在读卡器中。

于 2018-03-13T18:50:10.847 回答