上一篇Parse ISO8583(五)筆記支付系統卡片初始密碼(Natural PIN)的產生,但當持卡人想指定或變更密碼(PIN),又或者金融機構寄發初始密碼函時希望採用動態PIN來提高安全,
單採 IBM3624就可能沒辦法符合需求,因此2000年之後,台灣的金融機構也陸續導入國外使用的密碼偏移量(PIN Offset)概念。
卡號(PAN)以PVK金鑰演算出一個固定的數值PIN,雖然不同PAN、不同金融機構(PVK金鑰)會算出不同數值,但參數中沒有包含到次數、新PIN或其他變數,當有動態密碼或變更密碼需求就殘念了。
Wiki上三種PIN的驗證方式,今天來試第二種: IBM3624 + PIN-Offset(偏移量)
- IBM 3624:通常只使用在產生Natural PIN,非常不適合使用在PIN驗證。
- IBM 3624 + PIN-Offset
- Visa PVV
簡單用一個式子表達 :
範例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
從wiki和國外Tan網友的文章探索發現,90年代時,PIN Offset會儲存在磁條中,類似下一篇會提到的PVV(密碼驗證值)。
- 前端POS設備或刷卡機會讀取磁軌二(Track2)放在ISO8583 DE35欄位。
- 持卡人輸入的PIN在前端經過初步加密運算成PIN Block,交易傳遞時放在ISO8583 DE52(PIN Block)欄位。
- 後台主機收到ISO8583後先從DE52 PIN Block還原出持卡人輸入的PIN。
- 後台主機先使用卡號(PAN)及PIN加密金鑰(PVK),計算出Natural PIN
- 接著再加上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驗證主要機制,找時間筆記。
參考:
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?