[.NET][C#]Parse ISO8583筆記(六)PIN Offset(密碼偏移量)

上一篇Parse ISO8583(五)筆記支付系統卡片初始密碼(Natural PIN)的產生,但當持卡人想指定或變更密碼(PIN),又或者金融機構寄發初始密碼函時希望採用動態PIN來提高安全,

單採 IBM3624就可能沒辦法符合需求,因此2000年之後,台灣的金融機構也陸續導入國外使用的密碼偏移量(PIN Offset)概念。

IBM3624 PIN Generation Algorithm 

卡號(PAN)以PVK金鑰演算出一個固定的數值PIN,雖然不同PAN、不同金融機構(PVK金鑰)會算出不同數值,但參數中沒有包含到次數、新PIN或其他變數,當有動態密碼或變更密碼需求就殘念了。

 

Wiki上三種PIN的驗證方式,今天來試第二種: IBM3624 + PIN-Offset(偏移量)

  • IBM 3624:通常只使用在產生Natural PIN,非常不適合使用在PIN驗證。
  • IBM 3624 + PIN-Offset 
  • Visa PVV

 

IBM3264 + PIN Offset Algorithm 

簡單用一個式子表達 :

Natural PIN+ PIN Offset = NEW PIN

範例1:假設Natural PIN 算出來是1234,持卡人指定PIN是9876,那麼PIN Offset就是8642。

範例2:假設Natural PIN 算出來是1234,持卡人指定PIN是2345,那麼PIN Offset就是1111。

*註:如果New PIN當中的數值小於Natural PIN,New PIN + 10 再減Natural。

 

初始動態密碼

當金融機構收到持卡人申請或是新製卡要同步寄發密碼函(PIN Mailer)時,國外的金融機構通常會隨機(Random)產生一組4位數字,接著使用卡號(PAN)及PIN加密金鑰(PVK)計算出Natural PIN,

再依照新密碼值(New PIN)計算每位數密碼的偏移量(Offset)。

Natural PIN+ PIN Offset = NEW PIN

Natural PIN- NEW PIN=  PIN Offset

*註:一般卡片遞送和密碼函會分開寄送,避免卡片盜用,同時盜用者也取得初始密碼。

*密碼函的使用就和PIN一樣已經超過30年了,安全性值得我們注意

變更密碼

當持卡人有變更密碼時也是類似的流程,後台設備或主機驗證舊密碼無誤後,使用卡號(PAN)及PIN加密金鑰(PVK)先計算出Natural PIN,再依照持卡人輸入的新密碼值計算每位數密碼的偏移量。

Natural PIN+ PIN Offset = NEW PIN

NEW PIN - Natural PIN=  PIN Offset

 

密碼PIN驗證

從wiki和國外Tan網友的文章探索發現,90年代時,PIN Offset會儲存在磁條中,類似下一篇會提到的PVV(密碼驗證值)。

  1. 前端POS設備或刷卡機會讀取磁軌二(Track2)放在ISO8583 DE35欄位。
  2. 持卡人輸入的PIN在前端經過初步加密運算成PIN Block,交易傳遞時放在ISO8583 DE52(PIN Block)欄位。
  3. 後台主機收到ISO8583後先從DE52 PIN Block還原出持卡人輸入的PIN
  4. 後台主機先使用卡號(PAN)及PIN加密金鑰(PVK),計算出Natural PIN
  5. 接著再加上PIN Offset算出正確PIN,此時的值就可以拿來驗證持卡人在ATM或PIN Pad上輸入的PIN是否相符。

 

OK,大致筆記了PIN Offset驗證流程,下一步我們試著用.NET C#來寫一段計算偏移值(Offset)的程式碼。

1.寫一段每位數字計算偏移量的方法

public int[] GetOffset(int[] NaturalPIN, int[] NewPIN)
{
    int[] PinOffset = new int[4];

    for (int i = 0; i < NaturalPIN.Length; i++)
    {
        if (NewPIN[i] < NaturalPIN[i])
        {
            NewPIN[i] = NewPIN[i] + 10;
        }
        PinOffset[i] = Math.Abs(NaturalPIN[i] - NewPIN[i]);
    }
    return PinOffset;
}

2.簡單寫一個測試

[TestMethod]
public void TestMethod1()
{
    int[] NaturalPIN = { 9, 8, 7, 6 };
    int[] NewPIN = { 1, 2, 3, 4 };
    Console.WriteLine("NaturalPIN={0}{1}{2}{3}", NaturalPIN[0], NaturalPIN[1], NaturalPIN[2], NaturalPIN[3]);
    Console.WriteLine("NewPIN={0}{1}{2}{3}", NewPIN[0], NewPIN[1], NewPIN[2], NewPIN[3]);

    int[] PinOffset = GetOffset(NaturalPIN, NewPIN);
    Console.WriteLine("PinOffset={0}{1}{2}{3}", PinOffset[0], PinOffset[1], PinOffset[2], PinOffset[3]);
}

測試結果

輸入Natural PIN :9878,輸入New Pin: 1234,最後用絕對值計算偏移量8978

3.我們試試看用上一篇[.NET][C#]Parse ISO8583筆記(五)Natural PIN產生的Natual PIN:0925案例來試算

輸入參數

  • PVKA,B = 0123456789ABCDEFFEDCBA9876543210 
  • PAN = 1234567890123456  
  • 指定PIN = 0000

同樣用eftlab工具驗證。

在PIN offset驗證功能中,選PIN功能Tabl,依序輸入相同的PVK、PAN,然後按下鎖頭的按鈕。

PIN Offset也是0185相符!

 

小結:

  • 有了PIN Offset,持卡人有變更過密碼或是金融機構初始採用動態PIN時,磁條或後台主機就不用直接儲存PIN,透過儲存PIN Offset來降低風險。
  • 無論單採第一種IBM3624或是加上Pin Offset的第二種,程式在處理過程中,除了持卡人自己輸入的密碼值,免不了要用正確的金鑰重新計算出正確的密碼值(過程風險),在驗證卡片的真偽性上,也沒辦法有足夠的機制,因此wiki上說明的第三種驗證方式Visa PVV就成為PIN驗證主要機制,找時間筆記。

 

 

參考:

PCI PIN Security Requirements

How are ATM PINs validated

Personal identification number

Are PIN Mailers still the best way to distribute PINs ?

Why doesn't changing the PIN affect recorded data on magnetic card?