Mã cơ sở 64 mã hóa và giải mã


214

Có ai biết cách giải mã và mã hóa một chuỗi trong Base64 bằng Base64 không. Tôi đang sử dụng đoạn mã sau, nhưng nó không hoạt động.

String source = "password"; 
byte[] byteArray = source.getBytes("UTF-16"); 
Base64 bs = new Base64(); 
//bs.encodeBytes(byteArray); 
System.out.println( bs.encodeBytes(byteArray)); 
//bs.decode(bs.encodeBytes(byteArray));
System.out.println(bs.decode(bs.encodeBytes(byteArray)));

1
Bạn phải nhập cái này import android.util.Base64;và sau đó có thể sử dụng Base64.encodeToString& Base64.decodetheo nhu cầu của bạn
Zohab Ali 8/12/18

Câu trả lời:


490

Đầu tiên:

  • Chọn một mã hóa. UTF-8 nói chung là một lựa chọn tốt; dính vào một mã hóa mà chắc chắn sẽ có giá trị ở cả hai bên. Rất hiếm khi sử dụng thứ gì đó ngoài UTF-8 hoặc UTF-16.

Kết thúc truyền:

  • Mã hóa chuỗi thành byte (ví dụ text.getBytes(encodingName))
  • Mã hóa các byte thành base64 bằng cách sử dụng Base64lớp
  • Truyền cơ sở64

Nhận kết thúc:

  • Nhận cơ sở64
  • Giải mã base64 thành byte bằng Base64lớp
  • Giải mã các byte thành một chuỗi (ví dụ new String(bytes, encodingName))

Vì vậy, một cái gì đó như:

// Sending side
byte[] data = text.getBytes("UTF-8");
String base64 = Base64.encodeToString(data, Base64.DEFAULT);

// Receiving side
byte[] data = Base64.decode(base64, Base64.DEFAULT);
String text = new String(data, "UTF-8");

Hoặc với StandardCharsets:

// Sending side
byte[] data = text.getBytes(StandardCharsets.UTF_8);
String base64 = Base64.encodeToString(data, Base64.DEFAULT);

// Receiving side
byte[] data = Base64.decode(base64, Base64.DEFAULT);
String text = new String(data, StandardCharsets.UTF_8);

bạn có thể cho tôi mã chính xác sẽ giúp ích rất nhiều. tôi đang sử dụng nhưng nó không hoạt động. Chuỗi nguồn = "mật khẩu"; byte [] byteArray = source.getBytes ("UTF-16"); Base64 bs = new Base64 (); //bs.encodeBytes(byteArray); System.out.println (bs.encodeBytes (byteArray)); //bs.decode(bs.encodeBytes(byteArray)); System.out.println (bs.decode (bs.encodeBytes (byteArray)));
tối đa

9
@max: "Nó không hoạt động" không bao giờ là một mô tả hay về những gì đang xảy ra. Sẽ chỉnh sửa bài viết của tôi mặc dù.
Jon Skeet

3
Cũng lưu ý rằng bạn không nên gọi các phương thức tĩnh như thể chúng là các phương thức cá thể ...
Jon Skeet

3
nếu bạn đặt nó như thế thì nó sẽ hoạt động String base64 = Base64.encodeToString (data, Base64.NO_WRAP);
Niềm vui

1
@portfoliobuilder: Hoàn toàn không. UTF-8được đảm bảo là một mã hóa hợp lệ trong Java: xem docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html . Phải thừa nhận rằng những ngày này tôi chỉ định StandardCharsets.UTF_8thay thế. Tôi đã cập nhật câu trả lời để xác định rằng bạn nên tự tin khi có bộ ký tự, nhưng tôi thường sử dụng UTF-8.
Jon Skeet

18

Đối với bất kỳ ai khác đã kết thúc ở đây trong khi tìm kiếm thông tin về cách giải mã chuỗi được mã hóa Base64.encodeBytes(), đây là giải pháp của tôi:

// encode
String ps = "techPass";
String tmp = Base64.encodeBytes(ps.getBytes());

// decode
String ps2 = "dGVjaFBhC3M=";
byte[] tmp2 = Base64.decode(ps2); 
String val2 = new String(tmp2, "UTF-8"); 

Ngoài ra, tôi đang hỗ trợ các phiên bản Android cũ hơn nên tôi đang sử dụng thư viện Base64 của Robert Harder's từ http://iharder.net/base64


10

Đối với Kotlin mb tốt hơn để sử dụng này:

fun String.decode(): String {
    return Base64.decode(this, Base64.DEFAULT).toString(charset("UTF-8"))
}

fun String.encode(): String {
    return Base64.encodeToString(this.toByteArray(charset("UTF-8")), Base64.DEFAULT)
}

Thí dụ:

Log.d("LOGIN", "TEST")
Log.d("LOGIN", "TEST".encode())
Log.d("LOGIN", "TEST".encode().decode())

1
Đặt tên cho các chức năng mở rộng này là khủng khiếp. Tôi rất khuyên bạn nên sử dụng encodeToBase64 hoặc một cái gì đó tương tự.
Rolf

Họ hoàn toàn không rõ ràng và rõ ràng. Nói cho tôi biết: "giải mã" hay "mã hóa" là gì? Có hàng ngàn thuật toán giải mã / mã hóa ... Nếu bạn cần Base64 và Hex thì sao? Làm thế nào bạn sẽ đặt tên cho các phương thức sau đó?
Rolf

Chưa kể các tiêu chuẩn Base64 khác nhau ngoài kia.
Rolf

Rõ ràng và rõ ràng cho trường hợp sử dụng này. Nếu tôi cần một thuật toán khác, tôi sẽ không bao giờ sử dụng nó làm phương pháp mở rộng.
brunql

1
Tuy nhiên, tôi thích một cái gì đó như: 'toBase64 ()' và 'fromBase64 ()' ở mức tối thiểu. Bằng cách này, tôi không cần phải đọc bất kỳ tài liệu nào để biết phương pháp sẽ làm gì. Hãy ghi nhớ: "mã được đọc nhiều hơn nó được viết".
Rolf

8

Nếu bạn đang sử dụng Kotlin hơn là sử dụng như thế này

Để mã hóa

val password = "Here Your String"
val data = password.toByteArray(charset("UTF-8"))
val base64 = Base64.encodeToString(data, Base64.DEFAULT)

Để giải mã

val datasd = Base64.decode(base64, Base64.DEFAULT)
val text = String(datasd, charset("UTF-8"))

3
Hoặc bạn có thể sử dụng Charsets.UTF_8 thay vì bộ ký tự ("UTF-8").
makovkastar

@makovkastar chỉ cần xác nhận, bây giờ StandardCharsets.UTF_8
Matt

7

cái gì đó như

String source = "password"; 
byte[] byteArray;
try {
    byteArray = source.getBytes("UTF-16");
    System.out.println(new String(Base64.decode(Base64.encode(byteArray,
           Base64.DEFAULT), Base64.DEFAULT)));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

5
Câu trả lời của bạn ngụ ý rằng mã hóa mật khẩu trong base64 là một cách thực hành tốt. Trong thực tế, nó KHÔNG phải là bất cứ ai có thể giải mã nó.
Heinrich

2

Để mã hóa:

byte[] encrpt= text.getBytes("UTF-8");
String base64 = Base64.encodeToString(encrpt, Base64.DEFAULT);

Để giải mã:

byte[] decrypt= Base64.decode(base64, Base64.DEFAULT);
String text = new String(decrypt, "UTF-8");

1

Dựa trên các câu trả lời trước tôi đang sử dụng các phương pháp tiện ích sau trong trường hợp bất kỳ ai cũng muốn sử dụng nó.

    /**
 * @param message the message to be encoded
 *
 * @return the enooded from of the message
 */
public static String toBase64(String message) {
    byte[] data;
    try {
        data = message.getBytes("UTF-8");
        String base64Sms = Base64.encodeToString(data, Base64.DEFAULT);
        return base64Sms;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return null;
}

/**
 * @param message the encoded message
 *
 * @return the decoded message
 */
public static String fromBase64(String message) {
    byte[] data = Base64.decode(message, Base64.DEFAULT);
    try {
        return new String(data, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return null;
}


0

Lớp 'java.util.Base64' cung cấp chức năng mã hóa và giải mã thông tin ở định dạng Base64.

Làm thế nào để có được Bộ mã hóa Base64?

Encoder encoder = Base64.getEncoder();

Làm thế nào để có được Bộ giải mã Base64?

Decoder decoder = Base64.getDecoder();

Làm thế nào để mã hóa dữ liệu?

Encoder encoder = Base64.getEncoder();
String originalData = "java";
byte[] encodedBytes = encoder.encode(originalData.getBytes());

Làm thế nào để giải mã dữ liệu?

Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedBytes);
String decodedStr = new String(decodedBytes);

Bạn có thể biết thêm chi tiết tại liên kết này .


-1
    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".BaseActivity">
   <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/edt"
       android:paddingTop="30dp"
       />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv1"
        android:text="Encode"
        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv2"

        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv3"
        android:text="decode"
        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv4"
        android:textSize="20dp"
        android:padding="20dp"


        />
</LinearLayout>

đây là để mã hóa và mã hóa thông qua base64 trong studio android
Asif Ali

Hãy cập nhật nhận xét của bạn trong câu trả lời. Cũng đăng Java và XML trong câu trả lời duy nhất.
Android

Viết một số giải thích cùng với một số mã luôn luôn là một thực hành tốt. Cảm ơn!
surajs1n

-1
package net.itempire.virtualapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class BaseActivity extends AppCompatActivity {
EditText editText;
TextView textView;
TextView textView2;
TextView textView3;
TextView textView4;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        editText=(EditText)findViewById(R.id.edt);
        textView=(TextView) findViewById(R.id.tv1);
        textView2=(TextView) findViewById(R.id.tv2);
        textView3=(TextView) findViewById(R.id.tv3);
        textView4=(TextView) findViewById(R.id.tv4);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             textView2.setText(Base64.encodeToString(editText.getText().toString().getBytes(),Base64.DEFAULT));
            }
        });

        textView3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView4.setText(new String(Base64.decode(textView2.getText().toString(),Base64.DEFAULT)));

            }
        });


    }
}

-2

cho API Android byte[]để Base64Stringmã hóa

byte[] data=new byte[];
String Base64encodeString=android.util.Base64.encodeToString(data, android.util.Base64.DEFAULT);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.