הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   שאלה - האם ניתן לדעת בוודאות? base64. (https://hosts.co.il/forums/showthread.php?t=69798)

Shon12 26-11-08 22:12

שאלה - האם ניתן לדעת בוודאות? base64.
 
שלום,
אני בונה משהו קטן כרגע. יש לי בעיה קטנה בזיהוי ההצפנה base64, מה זאת אומרת?
אז ככה, יש לי את ההצפנה הבאה ב-base64, לדוגמא:
PHP קוד:

dHJ5IHNvbXQgdGV4dC4uLg== 

אני רוצה לדעת בוודאות שזו הצפנה מסוג base64, ולא מחרוזת למשל...
גירסאת PHP:
4.48.

חשבתי על לקבל את האדרים של הדף ושם יהיה זיהוי כולשהו שיוכל לעזור לי, אך הגירסאת PHP לא תומכת.
REGEX - לא ממש עזר פה.

אשמח לעזרה, תודה.

FuZuL 26-11-08 23:44

http://src.opensolaris.org/source/xr...iscsi/base64.c
שאלה ממש יפה האמת, והשכלתי מחיפוש בגוגל.

Shon12 26-11-08 23:50

ציטוט:

נכתב במקור על ידי FuZuL (פרסם 684011)
http://src.opensolaris.org/source/xr...iscsi/base64.c
שאלה ממש יפה האמת, והשכלתי מחיפוש בגוגל.

קודם כל תודה,אך שכחתי לציין, שהבדיקה תתבצע ב-PHP...
אני לא יודע C \ c++ או מה שזה לא יהיה ;P כך שאני לא מבין את הקוד ואני לא יכול "להמיר" אותו ל-PHP. אשמח לעזרה נוספת.

Shon12 27-11-08 17:58

עזרה?:(

vadimg88 27-11-08 21:11

לא נראה לי שיש דרך, בטוח לא משהו שמשהו כאן יודע אחרת הוא היה מגיב. אני אישית לא שמעתי על דבר כזה.

intercooler3819 27-11-08 21:27

אממ תנסה לעשות לה BASE64 DEOCDE?

Shon12 27-11-08 21:32

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684197)
אממ תנסה לעשות לה BASE64 DEOCDE?

לא נראה לי שזה יעזור. אני לא חושב שהפונקצייה מחזירה false או משהו כזה.

vadimg88 27-11-08 22:07

הפונקציה מחזירה FALSE אם ה DECODE לא התבצע.

Shon12 27-11-08 22:42

ואוו לא חשבתי שזה כזה פשוט :S פשוט לא ידעתי שלפונקצייה יש FALSE במידה והיא לא נכונה...
בכל מקרה תודה רבה לכולם.

vadimg88 28-11-08 10:23

זה לא הפתרון אבל, אתה יכול לקבל סטרינג שהוא דומה בידיוק לBASE64 ואז תבצע עליו DECODE זה יבצע אותו אבל זה לא אומר שהוא היה ENCODED מלכחתחילה.

בניה 28-11-08 12:15

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 684236)
זה לא הפתרון אבל, אתה יכול לקבל סטרינג שהוא דומה בידיוק לBASE64 ואז תבצע עליו DECODE זה יבצע אותו אבל זה לא אומר שהוא היה ENCODED מלכחתחילה.

קשה לי להאמין שהוא יגיע לכזה מצב,המבנה של ההצפנה הזו מאוד עדין.

vadimg88 28-11-08 17:55

עדיין זה לא משהו שאפשר להסתמך עליו ב 100%. זה כבר לשיקולו של פותח הנושא.

intercooler3819 28-11-08 20:36

גם לMD5 יכולות להיות 2 קומבינציות שנותנות את אותו MD5

בכל מקרה
אתה יכול לעשות DECODE, במידה ויש לך FALSE אז סגרנו עניין
במידה ויש לך TRUE
קח את הערך אחרי הDECODE, תעשה לו ENCODE ותשווא עם הערך המקורי

בהצלחה

Shon12 29-11-08 11:54

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684366)
גם לMD5 יכולות להיות 2 קומבינציות שנותנות את אותו MD5

בכל מקרה
אתה יכול לעשות DECODE, במידה ויש לך FALSE אז סגרנו עניין
במידה ויש לך TRUE
קח את הערך אחרי הDECODE, תעשה לו ENCODE ותשווא עם הערך המקורי

בהצלחה

לא כל-כך הבנתי. אם איזה ערך להשוות אותו?

Grenade 29-11-08 17:18

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684366)
גם לMD5 יכולות להיות 2 קומבינציות שנותנות את אותו MD5

בכל מקרה
אתה יכול לעשות DECODE, במידה ויש לך FALSE אז סגרנו עניין
במידה ויש לך TRUE
קח את הערך אחרי הDECODE, תעשה לו ENCODE ותשווא עם הערך המקורי

בהצלחה

אתה טועה

intercooler3819 29-11-08 17:51

לומר אתה טועה גם אני יכול
איפה אני טועה

Rom 29-11-08 18:48

PHP קוד:

function is_base64_encoded($data) {
    if (
preg_match('%^[a-zA-Z0-9/+]*={0,2}$%'$data)) {
            return 
TRUE;
    } else {
            return 
FALSE;
    }


תשתמש בפונקציה הזאת, היא פורסמה בPHP.net

DvirCohen 29-11-08 20:05

ציטוט:

נכתב במקור על ידי Rom (פרסם 684535)
PHP קוד:

function is_base64_encoded($data) {
    if (
preg_match('%^[a-zA-Z0-9/+]*={0,2}$%'$data)) {
            return 
TRUE;
    } else {
            return 
FALSE;
    }


תשתמש בפונקציה הזאת, היא פורסמה בPHP.net


אמרו שזה לא נכון, מהסיבה שאם אני סתם יתן מחרוזת כזאת: dvir== אפחד לא אמר שהיא הצפנה של base64

Shon12 29-11-08 20:27

ציטוט:

נכתב במקור על ידי DvirCohen (פרסם 684562)
אמרו שזה לא נכון, מהסיבה שאם אני סתם יתן מחרוזת כזאת: dvir== אפחד לא אמר שהיא הצפנה של base64

...
אני ראיתי את הפונקצייה הזאת ממזמן וגם היא לא יכולה להגיד לי ב-100% שזאת הצפנה של base64, מהסיבה שדביר אמר.

vadimg88 29-11-08 21:13

כמו שאמרתי לא תמצא משהו ודאי ב 100% לכן אל תסתמך על זה. אבל באתר http://il.php.net/manual/en/function.base64-decode.php יש פונקציה שאכן נראית כמו אחת שתעבוד הכי טוב בעניין הזה.

PHP קוד:

function checkBase64Encoded($encodedString)
{
    
$length strlen($encodedString);

    
// Check every character.
    
for ($i 0$i $length; ++$i
    {
        
$c $encodedString[$i];
        if (
        (
$c '0' || $c '9')
        && (
$c 'a' || $c 'z')
        && (
$c 'A' || $c 'Z')
        && (
$c != '+')
        && (
$c != '/')
        && (
$c != '=')
        ) {
            
// Bad character found.
            
return false;
        }
    }
    
// Only good characters found.
    
return true;


הפונקציה בודקת תו תו ומוודא שזה נמצא בטווח התווים של האלפבית של ההצפנה שווה לנסות.

בניה 29-11-08 21:23

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 684585)
כמו שאמרתי לא תמצא משהו ודאי ב 100% לכן אל תסתמך על זה. אבל באתר http://il.php.net/manual/en/function.base64-decode.php יש פונקציה שאכן נראית כמו אחת שתעבוד הכי טוב בעניין הזה.

PHP קוד:

function checkBase64Encoded($encodedString)
{
    
$length strlen($encodedString);

    
// Check every character.
    
for ($i 0$i $length; ++$i
    {
        
$c $encodedString[$i];
        if (
        (
$c '0' || $c '9')
        && (
$c 'a' || $c 'z')
        && (
$c 'A' || $c 'Z')
        && (
$c != '+')
        && (
$c != '/')
        && (
$c != '=')
        ) {
            
// Bad character found.
            
return false;
        }
    }
    
// Only good characters found.
    
return true;


הפונקציה בודקת תו תו ומוודא שזה נמצא בטווח התווים של האלפבית של ההצפנה שווה לנסות.

זה בדיוק מה שהביטויים רגולריים ההם עושים.
אבל מה שחשוב זה לא רק אם התווים הם תווים של base64 תקניים אלא גם שהמבנה שההצפנה באמת נכון.
ואת זה אפשר לבדוק באופן פשוט ע"י לעשות decode לה.

לפותח האשכול:אתה רוצה לבדוק את זה בשביל משהו תאורטי או מעשי?
אם בשביל משהו מעשי,תגיד בשביל מה ואולי נוכל לעזור לך יותר ככה.

intercooler3819 29-11-08 21:30

לדעתי פתרתי אתת הבעיה כבר קודם
תקראו את התגובה שלי זה דיי ממצא
הכי קל לעשות DECODE, אם קיבלת FALSE אז זה אומר שזה לא BASE64 ENCODED
אם לא קיבלת FALSE אז קח את הערך שקיבלת מהDECODE, תעביר עליו ENCODE ואז תשווה אותו עם הערך המקורי שהוא צריך להיות ENCODED, אם הם שווים --> זה מוצפן בBASE 64

בהצלחה

Shon12 29-11-08 23:07

ניצן - תודה רבה לך, הצלחתי.
וכמובן תודה רבה לכל אלה שניסו לעזור.

הקוד:
PHP קוד:

<?php
$string 
"#iu3498r";
$new;
$out;

        if (
base64_encode($new) == $string)
        {
        
$out "BASE64";
        }
        else {
        
$out "Not a BASE64";
        }


    if (!
base64_decode($string))
    {
    
$out "can't decode";
    }

    else {
    
$new base64_decode($string);
    }

echo 
$out;
?>


intercooler3819 29-11-08 23:27

הקוד שלך קצת מוזר לי בכל מקרה הנה
PHP קוד:

function checkBase64Encoded ($encodedString)
{
    
$length strlen($encodedString); 

    for (
$i 0$i $length; ++$i)  
    { 
        
$c $encodedString[$i]; 
        if ( 
        (
$c '0' || $c '9'
        && (
$c 'a' || $c 'z'
        && (
$c 'A' || $c 'Z'
        && (
$c != '+'
        && (
$c != '/'
        && (
$c != '='
        ) { 
            return 
false
        } 
    } 

     if (
base64_decode($encodedString) === FALSE)
     {
          return 
false;
     }
     else if (
base64_encode(base64_decode($encodedString)) !== $encodedString)
     {
          return 
false;
     }

     return 
true;


לא בדקתי
תתפנק

DvirCohen 29-11-08 23:28

PHP קוד:

$new
$out

אני לא יכול לראות את זה :\
אם אתה לא מקצה למשתנים ערך אל תצהיר עליהם בכלל..חבל על הזיכרון

intercooler3819 29-11-08 23:34

ציטוט:

נכתב במקור על ידי DvirCohen (פרסם 684610)
PHP קוד:

$new
$out

אני לא יכול לראות את זה :\
אם אתה לא מקצה למשתנים ערך אל תצהיר עליהם בכלל..חבל על הזיכרון

זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

בניה 29-11-08 23:39

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684613)
זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

היא לא זוללת,היא מקצה הכל באופן דינאמי.
והגודל int קבוע מראש לפי מספר שקבוע מphp.ini

Shon12 29-11-08 23:46

בקשר לאיך שהגדרתי את המשתנים - אני לא בקיא באיך שהמשתנים נכנסים לזיכרון וכל זה, אבל לפעם הבאה אני אדע.
בכל מקרה הרעיון של ניצן באמת עובד חלק, ניצן את האמת? לא הבנתי אפילו איך זה עובד... אתה יכול להסביר?
כלומר איך הוא באמת מזהה שזאת הצפנה תקינה בזה שעשית לו ENCODE וDECODE, לפי מה שטיפה הבנתי שסגרת את כל הקומבינציות אם ההצפנה תקינה או לא.

vadimg88 30-11-08 09:55

לפי הדוקומנטציה בישביל שה DECODE יחזיר FALSE צריך להעביר לו פרמטר שני שיהיה שוורה ל TRUE או 1

PHP קוד:

if (base64_decode($encodedString) === FALSE

צריך להיות

PHP קוד:

if (base64_decode($encodedStringture) === FALSE


DvirCohen 30-11-08 18:14

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684613)
זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

האמת שאני לא יודע איך אפשר להגדיר סוג משתנה כשאתה מצהיר עליו.
מאז שאני לומד JAVA, אם הייתי יודע איך להצהיר על סוג משתנה, יש מצב הייתי עושה את זה.

בכל מקרה זה שיטה מפגרת לדעתי ההצהרה של משתנים.
אם אתה לא נותן להם ערך, אין שום סיבה להצהיר עליהם.

ציטוט:

נכתב במקור על ידי Shon12 (פרסם 684617)
בקשר לאיך שהגדרתי את המשתנים - אני לא בקיא באיך שהמשתנים נכנסים לזיכרון וכל זה, אבל לפעם הבאה אני אדע.
בכל מקרה הרעיון של ניצן באמת עובד חלק, ניצן את האמת? לא הבנתי אפילו איך זה עובד... אתה יכול להסביר?
כלומר איך הוא באמת מזהה שזאת הצפנה תקינה בזה שעשית לו ENCODE וDECODE, לפי מה שטיפה הבנתי שסגרת את כל הקומבינציות אם ההצפנה תקינה או לא.

ברגע שיש לך מחרוזת, ותעשה לה encode ואז decode שוב והיא תהיה שווה למחרוזת שהייתה בהתחלה, זה אומר שהמחרוזת הוצפנה, כי אז הencode שלה יהיה תמיד זהה.
אם תיקח סתם מחרוזת, לדוגמא dvir==, ותעשה לה encode, ואז תעשה decode למחרוזת החדשה, זה לא יהיה אותו דבר.

intercooler3819 01-12-08 00:03

דביר
PHP קוד:

$a = (int)13.3;
$b = (bool) 1

זה CASTING לכל דבר.. קיים בכל השפות
רק שבPHP הוא משמש גם כדי להגדיר משתנים

וד'א בPHP לא מגדירים משתנים כי זה דיי מבוסס פרל
בפרל האינטרפרטר מקצה מקום וסוג לפי מה שמוזן למשתנה באותו רגע

וואדים - כתבתי מהראש.. טוב לדעת
זה קיים בPHP5 או גם בגרסאות הישנו><.?

vadimg88 01-12-08 14:16

ציטוט:

5.2.0 strict added
...


כל הזמנים הם GMT +2. הזמן כעת הוא 03:31.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ