2013-02-22 49 views
5

Tôi đã tạo biểu mẫu đăng nhập nơi người dùng gửi tên người dùng và mật khẩu của mình. Nếu tên người dùng tồn tại, tôi giải mã mật khẩu và kiểm tra xem có giống mật khẩu đã gửi hay không.Codeigniter không thể giải mã mật khẩu được mã hóa

// Đây là từ db

string(50) "v+bNPHNWHGQbcxrvu1vN8Ty++cMq0oEeaZesvfCfsLgNAFgZno" 

// Và đây là sau khi giải mã chuỗi trên

string(32) "�� U�U{q�0�4��è€UC��o�/�*�." 

Nhưng nó phải trở

Đối với mã hóa tôi sử dụng

$this->encrypt->encode('123456'); 

Và đây là khóa bí mật

$config['encryption_key'] = 'kRlaMneym7rF'; 

// Sửa

Vấn đề được rằng trường mật khẩu được thiết lập để varchar 50

+3

Bạn không nên mã hóa mật khẩu của mình nhưng băm chúng.Sau đó, khi người dùng cố gắng đăng nhập, bạn băm giá trị đã gửi và kiểm tra nó bằng hàm băm trong cơ sở dữ liệu. Có nhiều hơn một chút để nó (muối, vv), nhưng đó là cơ bản nó. – jeroen

+0

Làm cách nào để giải mã dữ liệu? – Repox

+0

$ this-> encrypt-> decode ('v + bNPHNWHGQbcxrvu1vN8Ty ++ cMq0oEeaZesvfCfsLgNAFgZno'); – Ben

Trả lời

4

Vui lòng kiểm tra charset CodeIgniter của bạn trong cấu hình

$config['charset'] = 'UTF-8'; 

so với charset của cơ sở dữ liệu của bạn. Xung đột của bạn có thể đến từ đó.

Đặt Codeigniter để kiểm tra xem nó có trả về kết quả đúng hay không. Hãy thử mã hóa cứng như trước hoặc sao chép và kiểm tra điều này trong bộ điều khiển của bạn.

function testencrypting(){ 
    $str = '12345'; 
    $key = 'my-secret-key'; 
    $encrypted = $this->encrypt->encode($str, $key); 
    echo $this->encrypt->decode($encrypted, $key); 
    exit; 

}

mỏ sản xuất các kết quả mong đợi: 12345. Nếu thành công, sau đó vấn đề của bạn có thể là CHARACTER SET (CHARSET). Tôi đang sử dụng một khóa mã hóa ở đây. Bạn có thể sử dụng mặc định trong cấu hình bằng cách bỏ tham số thứ hai trong mã hóa và giải mã.

Hãy cho tôi biết nếu điều đó đã giúp

3

Bạn muốn băm, chứ không phải mã hóa, và bạn có thể làm điều này với thư viện mã hóa CodeIgniter sử dụng SHA1 cho băm.

$password = $this->encrypt->sha1('123456'); 

Điều này sẽ trả lại 7c4a8d09ca3762af61e59520943dc26494f8941b, là những gì sẽ được lưu trữ trong cơ sở dữ liệu.

Bạn không thể un băm mật khẩu - bạn muốn kiểm tra đầu vào được băm vào băm trong cơ sở dữ liệu.

2

Các bạn đã thử:

$this->encrypt->decode($string); 
0

ive đã tìm ra điều này. tôi thấy rằng đó là vì bảng tôi đang sử dụng để lưu trữ unicode mật khẩu là latin1. tôi đã thay đổi mật khẩu trường bảng người dùng thành utf-8, dường như để khắc phục sự cố này

2

Nguyên nhân có thể là độ dài của trường đó trong cơ sở dữ liệu của bạn. Tôi có một cánh đồng quá ngắn.

Các vấn đề liên quan