গুগল প্রমাণীকরণকারী জনসাধারণের পরিষেবা হিসাবে উপলব্ধ?


146

স্ব-চলমান (যেমন ল্যাম্প স্ট্যাক) ওয়েব অ্যাপ্লিকেশনগুলিতে গুগল প্রমাণীকরণকারী (দুটি ফ্যাক্টর প্রমাণীকরণ) ব্যবহারের জন্য কি পাবলিক এপিআই রয়েছে ?

উত্তর:


121

প্রকল্পের ওপেন সোর্স। আমি এটি ব্যবহার করিনি। তবে এটি একটি ডকুমেন্টেড অ্যালগরিদম (ওপেন সোর্স প্রকল্প পৃষ্ঠায় তালিকাভুক্ত আরএফসিতে উল্লিখিত) ব্যবহার করছে এবং প্রমাণীকরণকারী বাস্তবায়ন একাধিক অ্যাকাউন্টকে সমর্থন করে।

আসল প্রক্রিয়াটি সোজা। ওয়ান টাইম কোডটি মূলত সিউডো এলোমেলো সংখ্যা জেনারেটর। একটি এলোমেলো সংখ্যা জেনারেটর এমন একটি সূত্র যা একবার বীজ দিয়েছিল বা শুরুর সংখ্যাটি এলোমেলো সংখ্যার একটি স্ট্রিম তৈরি করে চলেছে। একটি বীজ দেওয়া হয়েছে, যখন সংখ্যাগুলি একে অপরের সাথে এলোমেলো হতে পারে তবে ক্রমটি নিজেই নির্বিচারক। সুতরাং, একবার আপনার ডিভাইস এবং সার্ভারটি "সিঙ্কে" পরে ডিভাইসটি যে র্যান্ডম সংখ্যাগুলি তৈরি করে, প্রতিবার আপনি "পরবর্তী নম্বর বোতাম" চাপলে সার্ভারটি প্রত্যাশা একই, এলোমেলো, সংখ্যাগুলি হবে।

একটি নিরাপদ ওয়ান টাইম পাসওয়ার্ড সিস্টেম এলোমেলো সংখ্যা জেনারেটরের চেয়ে পরিশীলিত তবে ধারণাটি একই রকম similar ডিভাইস এবং সার্ভারকে সিঙ্কে রাখতে সহায়তা করার জন্য অন্যান্য বিশদ রয়েছে।

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

আপনার পরিশীলনের উপর নির্ভর করে ওএসএস প্রকল্প এবং আরএফসিকে এই প্রক্রিয়াটির সার্ভার সাইডটি কার্যকর করার জন্য আপনার যা দরকার তা থাকা উচিত। আপনার সার্ভার সফ্টওয়্যার (পিএইচপি, জাভা,। নেট, ইত্যাদি) এর জন্য একটি নির্দিষ্ট প্রয়োগ আছে কিনা তা আমি জানি না

তবে, বিশেষভাবে, এটি পরিচালনা করার জন্য আপনার কোনও অফসাইট পরিষেবা দরকার নেই service


3
অন্যদিকে, ইতিমধ্যে বিদ্যমান, সুপরিচিত, সহজেই অনেকগুলি বিভিন্ন মোবাইল ডিভাইসে সমাধান পাওয়া সহজ ব্যবহার করে লাভজনক ... (ইঙ্গিত)
সরল ব্যবহারকারী

26
মানে এসএমএস? এটি ধীর, অবিশ্বাস্য এবং ব্যয়বহুল।
আছরাফ আলামুলৌদি

খাঁটি জাভাতে ওয়েবসাইটগুলির জন্য গুগল প্রমাণীকরণকারী / আরএফসি 6238 সামঞ্জস্যপূর্ণ 2fa কীভাবে প্রয়োগ করতে হবে সে সম্পর্কে আমি ব্লগ করেছি: asaph.org/2016/04/google-authenticator-2fa-java.html (নির্লজ্জ প্লাগ)
আসফ

2
এফওয়াইআই এনআইএসটি অগস্ট ২০১ 2016 সালের হিসাবে এসএমএস ব্যবহার করে দ্বি-ফ্যাক্টর প্রমাণীকরণের সুপারিশ করা আর দীর্ঘ নয় Never
TheDPQ

57

অ্যালগরিদম আরএফসি 6238 এ নথিভুক্ত করা হয়েছে । কিছুটা এভাবে যায়:

  • আপনার সার্ভার ব্যবহারকারীকে গুগল প্রমাণীকরণকারীর মধ্যে ইনস্টল করার জন্য একটি গোপনীয়তা দেয়। গুগল এখানে কিউআর কোড ডকুমেন্টেড হিসাবে এটি করে
  • গুগল প্রমাণীকরণকারী ইউনিক্স সময় এবং গোপনীয়তা (আরএফসি এ সম্পর্কে আরও অনেক বিস্তারিত) এর মাধ্যমে একটি 6 ডিজিটের কোড উত্পন্ন করে
  • সার্ভারটি 6-সংখ্যার কোডটি যাচাই করার জন্য গোপন / ইউনিক্স সময়ও জানে।

আমি এখানে জাভাস্ক্রিপ্টে অ্যালগরিদম বাস্তবায়ন করার একটি নাটক পেয়েছি: http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/


20

পিএইচপি (ল্যাম্প স্ট্যাক) এর জন্য বিভিন্ন পাঠাগার রয়েছে

পিএইচপি

https://code.google.com/p/ga4php/

http://www.idontplaydarts.com/2011/07/google-totp-two-factor-authentication-for-php/

দ্বি-ফ্যাক্টর লেখার বাস্তবায়ন করার সময় আপনার সতর্কতা অবলম্বন করা উচিত, আপনার সার্ভার এবং ক্লায়েন্টের আপনার ঘড়িগুলি সিঙ্ক্রোনাইজ করা উচিত, টোকেনের উপর ব্রুট-ফোর্সের আক্রমণগুলির বিরুদ্ধে সুরক্ষা রয়েছে এবং ব্যবহৃত প্রাথমিক বীজটি যথেষ্ট পরিমাণে বড় is


সামগ্রীটি দুর্দান্ত ছিল তবে প্রথম লিঙ্কটি ব্যবহারকারী যে কোনও ব্যক্তির এসকিউএল ইঞ্জেকশন প্রতিরোধের পদ্ধতিগুলি প্রয়োগ করা উচিত, কারণ এতে কিছু সম্ভাব্য ত্রুটি রয়েছে। প্রথমটির জন্য উত্থাপিত বিষয়গুলি দেখুন। দ্বিতীয় লিঙ্কটি নিখুঁত।
সেপ্টেম্বর

9

আপনি আমার সমাধান ব্যবহার করতে পারেন , আমার প্রশ্নের উত্তর হিসাবে পোস্ট করা হয়েছে (এখানে পাইথন কোড এবং ব্যাখ্যা রয়েছে ):

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

এটি পিএইচপি বা পার্লে প্রয়োগ করা বরং সহজ I আপনার যদি এ নিয়ে কোনও সমস্যা থাকে তবে দয়া করে আমাকে জানান।

আমি পাইথন মডিউল হিসাবে গিটহাবে আমার কোড পোস্ট করেছি


1
একটু ঘটনার পরে ... আমি শুধু উল্লেখ CPAN একটি পার্ল মডিউল নেই দ্বারা অনুসরণ করা চেয়েছিলেন: প্রমাণীকরণ :: GoogleAuthenticator ( search.cpan.org/dist/Auth-GoogleAuthenticator )।
ডেভিডো

6

আমি এটি পেয়েছি: https://github.com/PHPGangsta/GoogleAuthenticator । আমি এটি পরীক্ষা করেছি এবং আমার জন্য ভাল কাজ করে।


1
আমি মনে করি আপনি github.com/RobThree/TwoFactorAuth পছন্দ করবেন । এটি উপরের লাইব্রেরির উপর ভিত্তি করে তবে এটিতে আরও বৈশিষ্ট্য এবং পরিষ্কার ডকুমেন্টেশন সহ এটির একটি বিশাল উন্নতি।
Ema4rl


3

হ্যাঁ, কোনও নেটওয়ার্ক পরিষেবা দরকার নেই, কারণ গুগল প্রমাণীকরণকারী অ্যাপ্লিকেশন গুগল সার্ভারের সাথে যোগাযোগ করবে না, এটি সময় পাস করার সাথে সাথে আপনার সার্ভারটি যে উত্স তৈরি করে (কিউআর কোড থেকে আপনার ফোনে ইনপুট) তা কেবলমাত্র সাথে সিঙ্ক করে রাখে।


2

ল্যাম্প নয় তবে আপনি যদি সি # ব্যবহার করেন তবে এই কোডটি আমি ব্যবহার করি:

কোডটি মূলত:

https://github.com/kspearrin/Otp.NET

বেস 32 এনকোডিং ক্লাসটি এই উত্তর থেকে:

https://stackoverflow.com/a/7135008/3850405

উদাহরণ প্রোগ্রাম:

class Program
{
    static void Main(string[] args)
    {
        var bytes = Base32Encoding.ToBytes("JBSWY3DPEHPK3PXP");

        var totp = new Totp(bytes);

        var result = totp.ComputeTotp();
        var remainingTime = totp.RemainingSeconds();
    }
}

Totp:

public class Totp
{
    const long unixEpochTicks = 621355968000000000L;

    const long ticksToSeconds = 10000000L;

    private const int step = 30;

    private const int totpSize = 6;

    private byte[] key;

    public Totp(byte[] secretKey)
    {
        key = secretKey;
    }

    public string ComputeTotp()
    {
        var window = CalculateTimeStepFromTimestamp(DateTime.UtcNow);

        var data = GetBigEndianBytes(window);

        var hmac = new HMACSHA1();
        hmac.Key = key;
        var hmacComputedHash = hmac.ComputeHash(data);

        int offset = hmacComputedHash[hmacComputedHash.Length - 1] & 0x0F;
        var otp = (hmacComputedHash[offset] & 0x7f) << 24
               | (hmacComputedHash[offset + 1] & 0xff) << 16
               | (hmacComputedHash[offset + 2] & 0xff) << 8
               | (hmacComputedHash[offset + 3] & 0xff) % 1000000;

        var result = Digits(otp, totpSize);

        return result;
    }

    public int RemainingSeconds()
    {
        return step - (int)(((DateTime.UtcNow.Ticks - unixEpochTicks) / ticksToSeconds) % step);
    }

    private byte[] GetBigEndianBytes(long input)
    {
        // Since .net uses little endian numbers, we need to reverse the byte order to get big endian.
        var data = BitConverter.GetBytes(input);
        Array.Reverse(data);
        return data;
    }

    private long CalculateTimeStepFromTimestamp(DateTime timestamp)
    {
        var unixTimestamp = (timestamp.Ticks - unixEpochTicks) / ticksToSeconds;
        var window = unixTimestamp / (long)step;
        return window;
    }

    private string Digits(long input, int digitCount)
    {
        var truncatedValue = ((int)input % (int)Math.Pow(10, digitCount));
        return truncatedValue.ToString().PadLeft(digitCount, '0');
    }

}

Base32Encoding:

public static class Base32Encoding
{
    public static byte[] ToBytes(string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            throw new ArgumentNullException("input");
        }

        input = input.TrimEnd('='); //remove padding characters
        int byteCount = input.Length * 5 / 8; //this must be TRUNCATED
        byte[] returnArray = new byte[byteCount];

        byte curByte = 0, bitsRemaining = 8;
        int mask = 0, arrayIndex = 0;

        foreach (char c in input)
        {
            int cValue = CharToValue(c);

            if (bitsRemaining > 5)
            {
                mask = cValue << (bitsRemaining - 5);
                curByte = (byte)(curByte | mask);
                bitsRemaining -= 5;
            }
            else
            {
                mask = cValue >> (5 - bitsRemaining);
                curByte = (byte)(curByte | mask);
                returnArray[arrayIndex++] = curByte;
                curByte = (byte)(cValue << (3 + bitsRemaining));
                bitsRemaining += 3;
            }
        }

        //if we didn't end with a full byte
        if (arrayIndex != byteCount)
        {
            returnArray[arrayIndex] = curByte;
        }

        return returnArray;
    }

    public static string ToString(byte[] input)
    {
        if (input == null || input.Length == 0)
        {
            throw new ArgumentNullException("input");
        }

        int charCount = (int)Math.Ceiling(input.Length / 5d) * 8;
        char[] returnArray = new char[charCount];

        byte nextChar = 0, bitsRemaining = 5;
        int arrayIndex = 0;

        foreach (byte b in input)
        {
            nextChar = (byte)(nextChar | (b >> (8 - bitsRemaining)));
            returnArray[arrayIndex++] = ValueToChar(nextChar);

            if (bitsRemaining < 4)
            {
                nextChar = (byte)((b >> (3 - bitsRemaining)) & 31);
                returnArray[arrayIndex++] = ValueToChar(nextChar);
                bitsRemaining += 5;
            }

            bitsRemaining -= 3;
            nextChar = (byte)((b << bitsRemaining) & 31);
        }

        //if we didn't end with a full char
        if (arrayIndex != charCount)
        {
            returnArray[arrayIndex++] = ValueToChar(nextChar);
            while (arrayIndex != charCount) returnArray[arrayIndex++] = '='; //padding
        }

        return new string(returnArray);
    }

    private static int CharToValue(char c)
    {
        int value = (int)c;

        //65-90 == uppercase letters
        if (value < 91 && value > 64)
        {
            return value - 65;
        }
        //50-55 == numbers 2-7
        if (value < 56 && value > 49)
        {
            return value - 24;
        }
        //97-122 == lowercase letters
        if (value < 123 && value > 96)
        {
            return value - 97;
        }

        throw new ArgumentException("Character is not a Base32 character.", "c");
    }

    private static char ValueToChar(byte b)
    {
        if (b < 26)
        {
            return (char)(b + 65);
        }

        if (b < 32)
        {
            return (char)(b + 24);
        }

        throw new ArgumentException("Byte is not a value Base32 value.", "b");
    }

}


-1

সি # ব্যবহারকারীর জন্য, কীভাবে এককালীন টোকেন কোড যাচাই করা যায় তা বোঝার জন্য এই সাধারণ কনসোল অ্যাপটি চালান run মনে রাখবেন যে প্রথমে আমাদের নিউগেজ প্যাকেজ থেকে লাইব্রেরি Otp.Net ইনস্টল করতে হবে ।

static string secretKey = "JBSWY3DPEHPK3PXP"; //add this key to your Google Authenticator app  

private static void Main(string[] args)
{
        var bytes = Base32Encoding.ToBytes(secretKey);

        var totp = new Totp(bytes);

        while (true)
        {
            Console.Write("Enter your code from Google Authenticator app: ");
            string userCode = Console.ReadLine();

            //Generate one time token code
            string tokenInApp = totp.ComputeTotp();
            int remainingSeconds = totp.RemainingSeconds();

            if (userCode.Equals(tokenInApp)
                && remainingSeconds > 0)
            {
                Console.WriteLine("Success!");
            }
            else
            {
                Console.WriteLine("Failed. Try again!");
            }
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.