পাইথনে গুগল প্রমাণীকরণকারী প্রয়োগকরণ


104

আমি এককালীন পাসওয়ার্ড ব্যবহার করার চেষ্টা করছি যা গুগল প্রমাণীকরণকারী অ্যাপ্লিকেশন ব্যবহার করে উত্পন্ন করা যেতে পারে ।

গুগল প্রমাণীকরণকারী কী করে

মূলত, গুগল প্রমাণীকরণকারী দুটি ধরণের পাসওয়ার্ড প্রয়োগ করে:

  • হটপ - এইচএমএসি-ভিত্তিক ওয়ান-টাইম পাসওয়ার্ড, যার অর্থ আরএফসি 4226 অনুসারে প্রতিটি কলের সাথে পাসওয়ার্ড পরিবর্তন করা হয় এবং
  • টোটিপি - সময়-ভিত্তিক ওয়ান-টাইম পাসওয়ার্ড, যা প্রতি 30-সেকেন্ড সময়কালে পরিবর্তিত হয় (যতদূর আমি জানি)।

গুগল প্রমাণীকরণকারী ওপেন সোর্স হিসাবে এখানে উপলব্ধ: কোড. google.com/p/google-authenticator ator

বর্তমান কোড

আমি HOTP এবং TOTP পাসওয়ার্ড তৈরি করার জন্য বিদ্যমান সমাধানগুলি সন্ধান করছিলাম, তবে খুব বেশি কিছু পাই নি। আমার কাছে থাকা কোডটি হটপ উত্পন্ন করার জন্য নিম্নলিখিত স্নিপেট দায়বদ্ধ:

import hmac, base64, struct, hashlib, time

def get_token(secret, digest_mode=hashlib.sha1, intervals_no=None):
    if intervals_no == None:
        intervals_no = int(time.time()) // 30
    key = base64.b32decode(secret)
    msg = struct.pack(">Q", intervals_no)
    h = hmac.new(key, msg, digest_mode).digest()
    o = ord(h[19]) & 15
    h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
    return h

আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল উপরের কোডটি ব্যবহার করে আমি যে পাসওয়ার্ডটি উত্পন্ন করি তা অ্যান্ড্রয়েডের জন্য গুগল প্রমাণীকরণকারী অ্যাপ্লিকেশন ব্যবহার করে উত্পন্ন করা মতো নয়। যদিও আমি জিএ অ্যাপ্লিকেশনটিতে উপলব্ধ চাবি সমান হয়ে একাধিক intervals_noমান (ঠিক প্রথম 10000 দিয়ে শুরু করে intervals_no = 0) চেষ্টা করেছি secret

আমার কাছে প্রশ্ন

আমার প্রশ্নগুলি হ'ল:

  1. আমি কি ভুল করছি?
  2. পাইথনে আমি কীভাবে HOTP এবং / অথবা TOTP উত্পন্ন করতে পারি?
  3. এর জন্য কি পাইথন লাইব্রেরি আছে?

সংক্ষেপে: দয়া করে আমাকে এমন কোনও ক্লু দিন যা আমার পাইথন কোডের মধ্যে Google প্রমাণীকরণকারী প্রমাণীকরণ কার্যকর করতে সহায়তা করবে।

উত্তর:


152

আমি আমার প্রশ্নের উপর একটি অনুগ্রহ সেট করতে চেয়েছিলাম, তবে আমি সমাধান তৈরি করতে সফল হয়েছি। আমার সমস্যাটি secretকী-এর ভুল মূল্যের সাথে সংযুক্ত রয়েছে বলে মনে হয়েছে (এটি base64.b32decode()ফাংশনের জন্য সঠিক প্যারামিটার হতে হবে )।

নীচে আমি এটি কীভাবে ব্যবহার করতে হয় তার বিশদ সহ সম্পূর্ণ কার্যকারী সমাধান পোস্ট করি।

কোড

নিম্নলিখিত কোডটি যথেষ্ট। ওটিটাইমপাস নামে আলাদা মডিউল হিসাবে এটি আমি গিটহাবে আপলোডও করেছি (এখানে উপলভ্য: https://github.com/tadeck/onetimepass )।

import hmac, base64, struct, hashlib, time

def get_hotp_token(secret, intervals_no):
    key = base64.b32decode(secret, True)
    msg = struct.pack(">Q", intervals_no)
    h = hmac.new(key, msg, hashlib.sha1).digest()
    o = ord(h[19]) & 15
    h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
    return h

def get_totp_token(secret):
    return get_hotp_token(secret, intervals_no=int(time.time())//30)

এর দুটি ফাংশন রয়েছে:

  • get_hotp_token() এককালীন টোকেন উত্পন্ন করে (এটি একক ব্যবহারের পরে অবৈধ হওয়া উচিত),
  • get_totp_token() সময়ের ভিত্তিতে টোকেন উত্পন্ন করে (30-সেকেন্ডের ব্যবধানে পরিবর্তিত),

পরামিতি

যখন এটি পরামিতি আসে:

  • secret সার্ভার (উপরের স্ক্রিপ্ট) এবং ক্লায়েন্ট (গুগল প্রমাণীকরণকারী, এটি প্রয়োগের মধ্যে পাসওয়ার্ড হিসাবে সরবরাহ করে) এর কাছে পরিচিত একটি গোপনীয় মূল্য,
  • intervals_no টোকেনের প্রতিটি প্রজন্মের পরে সংখ্যাটি বাড়ানো হয়েছে (এটি সম্ভবত অতীতে সফলভাবে সফল হওয়ার পরে কিছু সংখ্যক পূর্ণসংখ্যার পূর্ণসংখ্যার পরীক্ষা করে সার্ভারে সমাধান করা উচিত)

এটি কিভাবে ব্যবহার করতে

  1. উত্পন্ন করুন secret(এটির জন্য অবশ্যই সঠিক প্যারামিটার হওয়া উচিত base64.b32decode()) - পছন্দসইভাবে 16-চর (কোনও =চিহ্ন নেই), কারণ এটি অবশ্যই স্ক্রিপ্ট এবং গুগল প্রমাণীকরণকারী উভয়ের পক্ষে কাজ করেছে।
  2. ব্যবহারের get_hotp_token()আপনি এক সময় পাসওয়ার্ড প্রতিটি ব্যবহারের পর invalidated চান। গুগল অথেনটিকরে এই ধরণের পাসওয়ার্ড আমি কাউন্টারের উপর ভিত্তি করে উল্লেখ করেছি। সার্ভারে এটি পরীক্ষা করার জন্য আপনাকে কয়েকটি মান পরীক্ষা করতে হবে intervals_no(যেহেতু আপনার কোনও জামিন নেই যে ব্যবহারকারী কোনও কারণে অনুরোধগুলির মধ্যে পাস উত্পন্ন করেনি), তবে শেষের কার্যমানের চেয়ে কম নয় intervals_no(সুতরাং আপনার সম্ভবত এটি সংরক্ষণ করা উচিত) কোথাও)।
  3. get_totp_token()30 সেকেন্ডের বিরতিতে টোকেন কাজ করতে চাইলে ব্যবহার করুন Use আপনাকে অবশ্যই নিশ্চিত করতে হবে যে উভয় সিস্টেমে সঠিক সময় নির্ধারণ করেছে (যার অর্থ তারা উভয় সময়ে কোনও নির্দিষ্ট মুহুর্তে একই ইউনিক্স টাইমস্ট্যাম্প তৈরি করে)।
  4. হিংস্র আক্রমণ থেকে নিজেকে রক্ষা নিশ্চিত করুন। যদি সময় ভিত্তিক পাসওয়ার্ড ব্যবহার করা হয়, তবে 30 সেকেন্ডেরও কম সময়ে 1000000 মান চেষ্টা করে পাসওয়ার্ডটি অনুমান করার 100% সুযোগ দেয়। এইচএমএসি ভিত্তিক পাসওর্ডস (এইচটিপি) এর ক্ষেত্রে এটি আরও খারাপ বলে মনে হচ্ছে।

উদাহরণ

এক সময়কার এইচএমএসি-ভিত্তিক পাসওয়ার্ডের জন্য নিম্নলিখিত কোডটি ব্যবহার করার সময়:

secret = 'MZXW633PN5XW6MZX'
for i in xrange(1, 10):
    print i, get_hotp_token(secret, intervals_no=i)

আপনি নিম্নলিখিত ফলাফল পাবেন:

1 448400
2 656122
3 457125
4 35022
5 401553
6 581333
7 16329
8 529359
9 171710

যা গুগল প্রমাণীকরণকারী অ্যাপ্লিকেশন দ্বারা উত্পন্ন টোকেনের সাথে সম্পর্কিত ((টির চেয়ে কম চিহ্ন ছাড়াও, অ্যাপ্লিকেশনটি শুরুতে ছয় দৈর্ঘ্যে পৌঁছাতে শূন্যকে যুক্ত করে)।


3
@ বুরহান: আপনার যদি কোডটির প্রয়োজন হয় তবে আমি এটি গিটহাবটিতেও আপলোড করেছি (এখানে: https://github.com/tadeck/onetimepass ), সুতরাং এটি পৃথক মডিউল হিসাবে প্রকল্পগুলির মধ্যে ব্যবহার করা বেশ সহজ হওয়া উচিত। উপভোগ করুন!
টেডেক

1
এই কোডটি নিয়ে আমার সমস্যা ছিল কারণ আমি যে পরিষেবাটিতে লগ ইন করতে চাইছি তার দ্বারা 'গোপনীয়তা' সরবরাহ করা হচ্ছিল ছোট হাতের নয়, বড় হাতের। "কী = বেস64.b32decode (গোপন, সত্য)" পড়তে লাইন 4 পরিবর্তন করা আমার জন্য সমস্যাটি স্থির করেছে।
ক্রিস মুর

1
@ ক্রিসমুর: আমি কোডটি আপডেট করেছি casefold=Trueযাতে এখন লোকজনের যাতে সমস্যা হয় না। আপনার ইনপুট জন্য ধন্যবাদ।
টেডেক

3
আমাকে কেবল একটি সাইট দ্বারা একটি 23 চরিত্রের গোপনীয়তা দেওয়া হয়েছিল। আমি যখন এই গোপনীয়তাটি দিই তখন আপনার কোডটি "টাইপরর: ভুল প্যাডিং" দিয়ে ব্যর্থ হয়। গোপনীয়করণকে এইভাবে ছড়িয়ে দেওয়া, সমস্যাটি স্থির করে: কী = বেস64.b32decode (গোপন + '====' [[: 3 - ((লেন (গোপন) -1)% 4)], সত্য))
ক্রিস মুর

3
অজগর 3 এর জন্য: পরিবর্তন: এতে ord(h[19]) & 15: o = h[19] & 15 ধন্যবাদ বিটিডাব্লু
অরভিল

6

আমি টিটিপি পাসওয়ার্ড তৈরি করতে পাইথন স্ক্রিপ্ট চেয়েছিলাম। সুতরাং, আমি অজগর স্ক্রিপ্ট লিখেছি। এটি আমার বাস্তবায়ন। আমার কাছে উইকিপিডিয়ায় এই তথ্য এবং এই স্ক্রিপ্টটি লিখতে HOTP এবং TOTP সম্পর্কে কিছু জ্ঞান রয়েছে।

import hmac, base64, struct, hashlib, time, array

def Truncate(hmac_sha1):
    """
    Truncate represents the function that converts an HMAC-SHA-1
    value into an HOTP value as defined in Section 5.3.

    http://tools.ietf.org/html/rfc4226#section-5.3

    """
    offset = int(hmac_sha1[-1], 16)
    binary = int(hmac_sha1[(offset * 2):((offset * 2) + 8)], 16) & 0x7fffffff
    return str(binary)

def _long_to_byte_array(long_num):
    """
    helper function to convert a long number into a byte array
    """
    byte_array = array.array('B')
    for i in reversed(range(0, 8)):
        byte_array.insert(0, long_num & 0xff)
        long_num >>= 8
    return byte_array

def HOTP(K, C, digits=6):
    """
    HOTP accepts key K and counter C
    optional digits parameter can control the response length

    returns the OATH integer code with {digits} length
    """
    C_bytes = _long_to_byte_array(C)
    hmac_sha1 = hmac.new(key=K, msg=C_bytes, digestmod=hashlib.sha1).hexdigest()
    return Truncate(hmac_sha1)[-digits:]

def TOTP(K, digits=6, window=30):
    """
    TOTP is a time-based variant of HOTP.
    It accepts only key K, since the counter is derived from the current time
    optional digits parameter can control the response length
    optional window parameter controls the time window in seconds

    returns the OATH integer code with {digits} length
    """
    C = long(time.time() / window)
    return HOTP(K, C, digits=digits)

আকর্ষণীয়, তবে আপনি এটি পাঠকের জন্য আরও বোধগম্য করতে ইচ্ছুক হতে পারেন। পরিবর্তনশীল নামগুলি আরও অর্থবহ করে তুলুন, বা ডকাস্ট্রিং যুক্ত করুন। এছাড়াও, পিইপি 8 অনুসরণ করা আপনাকে আরও সমর্থন পেতে পারে। আপনি এই দুটি সমাধানের মধ্যে পারফরম্যান্সের তুলনা করেছেন? শেষ প্রশ্ন: আপনার সমাধান কি গুগল প্রমাণীকরণকারীর সাথে সামঞ্জস্যপূর্ণ (যেমন এই নির্দিষ্ট সমাধান সম্পর্কে প্রশ্নটি ছিল)?
টাডেক

@ টেডেক আমি কিছু মন্তব্য যুক্ত করেছি। এবং আমি এই স্ক্রিপ্টটি ব্যবহার করে আমার কাজগুলি শেষ করেছি। হ্যাঁ, এটি পুরোপুরি কাজ করা উচিত।
আনিস শাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.